TypeMapArrayIteratorTest.php 2.49 KB
Newer Older
1 2
<?php

3
namespace MongoDB\Tests\Model;
4

5
use MongoDB\Exception\BadMethodCallException;
6
use MongoDB\Model\TypeMapArrayIterator;
7
use MongoDB\Tests\TestCase;
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

class TypeMapArrayIteratorTest extends TestCase
{
    public function testCurrentAppliesTypeMap()
    {
        $document = [
            'array' => [1, 2, 3],
            'object' => ['foo' => 'bar'],
        ];

        $typeMap = [
            'root' => 'object',
            'document' => 'object',
            'array' => 'array',
        ];

        $iterator = new TypeMapArrayIterator([$document], $typeMap);

        $expectedDocument = (object) [
            'array' => [1, 2, 3],
            'object' => (object) ['foo' => 'bar'],
        ];

        $iterator->rewind();

        $this->assertEquals($expectedDocument, $iterator->current());
    }
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

    public function testOffsetGetAppliesTypeMap()
    {
        $document = [
            'array' => [1, 2, 3],
            'object' => ['foo' => 'bar'],
        ];

        $typeMap = [
            'root' => 'object',
            'document' => 'object',
            'array' => 'array',
        ];

        $iterator = new TypeMapArrayIterator([$document], $typeMap);

        $expectedDocument = (object) [
            'array' => [1, 2, 3],
            'object' => (object) ['foo' => 'bar'],
        ];

        $iterator->rewind();

        $this->assertEquals($expectedDocument, $iterator->offsetGet(0));
    }

    /**
62
     * @dataProvider provideMutateMethods
63
     */
64
    public function testMutateMethodsCannotBeCalled($method, $args)
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    {
        $document = [
            'array' => [1, 2, 3],
            'object' => ['foo' => 'bar'],
        ];

        $typeMap = [
            'root' => 'object',
            'document' => 'object',
            'array' => 'array',
        ];

        $iterator = new TypeMapArrayIterator([$document], $typeMap);

        $iterator->rewind();

81
        $this->expectException(BadMethodCallException::class);
82
        $this->expectExceptionMessage(TypeMapArrayIterator::class . ' is immutable');
83
        call_user_func_array([$iterator, $method], $args);
84 85
    }

86
    public function provideMutateMethods()
87
    {
88 89 90 91 92 93 94 95 96 97
        return [
            ['append', [['x' => 1]]],
            ['asort', []],
            ['ksort', []],
            ['natcasesort', []],
            ['natsort', []],
            ['offsetSet', [0, ['x' => 1]]],
            ['offsetUnset', [0]],
            ['uasort', [function($a, $b) { return 0; }]],
            ['uksort', [function($a, $b) { return 0; }]],
98 99
        ];
    }
100
}