Merge "mw.loader: Guard against odd setTimeout behaviour in old Firefox"
[mediawiki.git] / tests / phpunit / includes / libs / GenericArrayObjectTest.php
blob37a9b347f4acef0096cd2a09a773d8993f29d229
1 <?php
3 /**
4 * Tests for the GenericArrayObject and deriving classes.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 * http://www.gnu.org/copyleft/gpl.html
21 * @file
22 * @since 1.20
24 * @ingroup Test
25 * @group GenericArrayObject
27 * @licence GNU GPL v2+
28 * @author Jeroen De Dauw < jeroendedauw@gmail.com >
30 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
32 /**
33 * Returns objects that can serve as elements in the concrete GenericArrayObject deriving class being tested.
35 * @since 1.20
37 * @return array
39 abstract public function elementInstancesProvider();
41 /**
42 * Returns the name of the concrete class being tested.
44 * @since 1.20
46 * @return string
48 abstract public function getInstanceClass();
50 /**
51 * Provides instances of the concrete class being tested.
53 * @since 1.20
55 * @return array
57 public function instanceProvider() {
58 $instances = array();
60 foreach ( $this->elementInstancesProvider() as $elementInstances ) {
61 $instances[] = $this->getNew( $elementInstances[0] );
64 return $this->arrayWrap( $instances );
67 /**
68 * @since 1.20
70 * @param array $elements
72 * @return GenericArrayObject
74 protected function getNew( array $elements = array() ) {
75 $class = $this->getInstanceClass();
76 return new $class( $elements );
79 /**
80 * @dataProvider elementInstancesProvider
82 * @since 1.20
84 * @param array $elements
86 public function testConstructor( array $elements ) {
87 $arrayObject = $this->getNew( $elements );
89 $this->assertEquals( count( $elements ), $arrayObject->count() );
92 /**
93 * @dataProvider elementInstancesProvider
95 * @since 1.20
97 * @param array $elements
99 public function testIsEmpty( array $elements ) {
100 $arrayObject = $this->getNew( $elements );
102 $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
106 * @dataProvider instanceProvider
108 * @since 1.20
110 * @param GenericArrayObject $list
112 public function testUnset( GenericArrayObject $list ) {
113 if ( $list->isEmpty() ) {
114 $this->assertTrue( true ); // We cannot test unset if there are no elements
115 } else {
116 $offset = $list->getIterator()->key();
117 $count = $list->count();
118 $list->offsetUnset( $offset );
119 $this->assertEquals( $count - 1, $list->count() );
122 if ( !$list->isEmpty() ) {
123 $offset = $list->getIterator()->key();
124 $count = $list->count();
125 unset( $list[$offset] );
126 $this->assertEquals( $count - 1, $list->count() );
131 * @dataProvider elementInstancesProvider
133 * @since 1.20
135 * @param array $elements
137 public function testAppend( array $elements ) {
138 $list = $this->getNew();
140 $listSize = count( $elements );
142 foreach ( $elements as $element ) {
143 $list->append( $element );
146 $this->assertEquals( $listSize, $list->count() );
148 $list = $this->getNew();
150 foreach ( $elements as $element ) {
151 $list[] = $element;
154 $this->assertEquals( $listSize, $list->count() );
156 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
157 $list->append( $element );
158 } );
162 * @since 1.20
164 * @param callback $function
166 protected function checkTypeChecks( $function ) {
167 $excption = null;
168 $list = $this->getNew();
170 $elementClass = $list->getObjectType();
172 foreach ( array( 42, 'foo', array(), new stdClass(), 4.2 ) as $element ) {
173 $validValid = $element instanceof $elementClass;
175 try {
176 call_user_func( $function, $list, $element );
177 $valid = true;
178 } catch ( InvalidArgumentException $exception ) {
179 $valid = false;
182 $this->assertEquals(
183 $validValid,
184 $valid,
185 'Object of invalid type got successfully added to a GenericArrayObject'
191 * @dataProvider elementInstancesProvider
193 * @since 1.20
195 * @param array $elements
197 public function testOffsetSet( array $elements ) {
198 if ( $elements === array() ) {
199 $this->assertTrue( true );
200 return;
203 $list = $this->getNew();
205 $element = reset( $elements );
206 $list->offsetSet( 42, $element );
207 $this->assertEquals( $element, $list->offsetGet( 42 ) );
209 $list = $this->getNew();
211 $element = reset( $elements );
212 $list['oHai'] = $element;
213 $this->assertEquals( $element, $list['oHai'] );
215 $list = $this->getNew();
217 $element = reset( $elements );
218 $list->offsetSet( 9001, $element );
219 $this->assertEquals( $element, $list[9001] );
221 $list = $this->getNew();
223 $element = reset( $elements );
224 $list->offsetSet( null, $element );
225 $this->assertEquals( $element, $list[0] );
227 $list = $this->getNew();
228 $offset = 0;
230 foreach ( $elements as $element ) {
231 $list->offsetSet( null, $element );
232 $this->assertEquals( $element, $list[$offset++] );
235 $this->assertEquals( count( $elements ), $list->count() );
237 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
238 $list->offsetSet( mt_rand(), $element );
239 } );
243 * @dataProvider instanceProvider
245 * @since 1.21
247 * @param GenericArrayObject $list
249 public function testSerialization( GenericArrayObject $list ) {
250 $serialization = serialize( $list );
251 $copy = unserialize( $serialization );
253 $this->assertEquals( $serialization, serialize( $copy ) );
254 $this->assertEquals( count( $list ), count( $copy ) );
256 $list = $list->getArrayCopy();
257 $copy = $copy->getArrayCopy();
259 $this->assertArrayEquals( $list, $copy, true, true );