|
5 | 5 | use PHPUnit\Framework\TestCase;
|
6 | 6 | use NickLai\AssociativeArray;
|
7 | 7 |
|
| 8 | +use ArrayAccess; |
| 9 | +use ArrayIterator; |
| 10 | +use Countable; |
| 11 | +use ReflectionClass; |
| 12 | +use Traversable; |
| 13 | + |
8 | 14 | class AssociativeArrayTest extends TestCase
|
9 | 15 | {
|
10 | 16 | public function testSelect()
|
@@ -230,25 +236,140 @@ public function testArrayAccess()
|
230 | 236 | ['id' => 1003, 'category' => 'B', 'price' => 10],
|
231 | 237 | ]);
|
232 | 238 |
|
| 239 | + $this->assertInstanceOf(ArrayAccess::class, $associativeArray); |
| 240 | + |
233 | 241 | $this->assertEquals(
|
234 | 242 | ['id' => 1001, 'category' => 'C', 'price' => 10],
|
235 | 243 | $associativeArray[0]
|
236 | 244 | );
|
| 245 | + |
| 246 | + $associativeArray[] = ['id' => 1004, 'category' => 'D', 'price' => 50]; |
| 247 | + |
| 248 | + $this->assertTrue(isset($associativeArray[3])); |
| 249 | + $this->assertEquals(4, count($associativeArray)); |
| 250 | + $this->assertEquals(1004, $associativeArray[3]['id']); |
| 251 | + |
| 252 | + unset($associativeArray[3]); |
| 253 | + |
| 254 | + $this->assertFalse(isset($associativeArray[3])); |
| 255 | + $this->assertEquals(3, count($associativeArray)); |
237 | 256 | }
|
238 | 257 |
|
239 |
| - public function testTraversable() |
| 258 | + public function testCountable() |
240 | 259 | {
|
241 | 260 | $associativeArray = new AssociativeArray([
|
242 | 261 | ['id' => 1001, 'category' => 'C', 'price' => 10],
|
243 | 262 | ['id' => 1002, 'category' => 'A', 'price' => 25],
|
244 | 263 | ['id' => 1003, 'category' => 'B', 'price' => 10],
|
245 | 264 | ]);
|
246 | 265 |
|
247 |
| - foreach ($associativeArray as $row) { |
248 |
| - $this->assertEquals(['id' => 1001, 'category' => 'C', 'price' => 10], $row); |
249 |
| - return; |
| 266 | + $this->assertInstanceOf(Countable::class, $associativeArray); |
| 267 | + $this->assertCount(3, $associativeArray); |
| 268 | + } |
| 269 | + |
| 270 | + public function testTraversable() |
| 271 | + { |
| 272 | + $data = [ |
| 273 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 274 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 275 | + ]; |
| 276 | + |
| 277 | + $associativeArray = new AssociativeArray($data); |
| 278 | + |
| 279 | + $this->assertInstanceOf(Traversable::class, $associativeArray); |
| 280 | + |
| 281 | + foreach ($associativeArray as $index => $row) { |
| 282 | + $this->assertEquals($data[$index], $row); |
250 | 283 | }
|
| 284 | + } |
| 285 | + |
| 286 | + public function testIterable() |
| 287 | + { |
| 288 | + $data = [ |
| 289 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 290 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 291 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 292 | + ]; |
| 293 | + |
| 294 | + $associativeArray = new AssociativeArray($data); |
| 295 | + |
| 296 | + $this->assertInstanceOf(ArrayIterator::class, $associativeArray->getIterator()); |
| 297 | + $this->assertEquals($data, $associativeArray->getIterator()->getArrayCopy()); |
| 298 | + } |
| 299 | + |
| 300 | + public function testArrayAccessOffsetExists() |
| 301 | + { |
| 302 | + $associativeArray = new AssociativeArray([ |
| 303 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 304 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 305 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 306 | + ]); |
| 307 | + |
| 308 | + $this->assertTrue($associativeArray->offsetExists(0)); |
| 309 | + $this->assertTrue($associativeArray->offsetExists(1)); |
| 310 | + $this->assertFalse($associativeArray->offsetExists(1000)); |
| 311 | + } |
| 312 | + |
| 313 | + public function testArrayAccessOffsetGet() |
| 314 | + { |
| 315 | + $data = [ |
| 316 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 317 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 318 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 319 | + ]; |
| 320 | + |
| 321 | + $associativeArray = new AssociativeArray($data); |
| 322 | + |
| 323 | + $this->assertEquals($data[0], $associativeArray->offsetGet(0)); |
| 324 | + $this->assertEquals($data[1], $associativeArray->offsetGet(1)); |
| 325 | + $this->assertEquals($data[2], $associativeArray->offsetGet(2)); |
| 326 | + } |
| 327 | + |
| 328 | + public function testArrayAccessOffsetSet() |
| 329 | + { |
| 330 | + $data = [ |
| 331 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 332 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 333 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 334 | + ]; |
| 335 | + |
| 336 | + $associativeArray = new AssociativeArray($data); |
| 337 | + |
| 338 | + $row = ['id' => 1004, 'category' => 'D', 'price' => 50]; |
| 339 | + |
| 340 | + $associativeArray->offsetSet(0, $row); |
| 341 | + $this->assertEquals($row, $associativeArray->first()); |
| 342 | + |
| 343 | + $associativeArray->offsetSet(null, $row); |
| 344 | + $this->assertEquals($row, $associativeArray->last()); |
| 345 | + } |
| 346 | + |
| 347 | + public function testArrayAccessOffsetUnset() |
| 348 | + { |
| 349 | + $associativeArray = new AssociativeArray([ |
| 350 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 351 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 352 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 353 | + ]); |
| 354 | + |
| 355 | + $associativeArray->offsetUnset(2); |
| 356 | + $this->assertFalse(isset($associativeArray[2])); |
| 357 | + } |
| 358 | + |
| 359 | + public function testGetAssociativeRows() |
| 360 | + { |
| 361 | + $associativeArray = new AssociativeArray; |
| 362 | + $class = new ReflectionClass($associativeArray); |
| 363 | + $method = $class->getMethod('getAssociativeRows'); |
| 364 | + $method->setAccessible(true); |
| 365 | + |
| 366 | + $data = [ |
| 367 | + ['id' => 1001, 'category' => 'C', 'price' => 10], |
| 368 | + ['id' => 1002, 'category' => 'A', 'price' => 25], |
| 369 | + ['id' => 1003, 'category' => 'B', 'price' => 10], |
| 370 | + ]; |
251 | 371 |
|
252 |
| - $this->assertEquals(0, 1); |
| 372 | + $this->assertSame($data, $method->invokeArgs($associativeArray, [new AssociativeArray($data)])); |
| 373 | + $this->assertSame($data, $method->invokeArgs($associativeArray, [$data])); |
253 | 374 | }
|
254 | 375 | }
|
0 commit comments