Completed
Branch master (c74b62)
by Max
01:08
created

DataWrapperTest::testCheckFieldRelated()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 10
Ratio 100 %

Importance

Changes 0
Metric Value
dl 10
loc 10
rs 9.9332
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
/*
3
 * @copyright (c) 2020 Mendel <[email protected]>
4
 * @license see license.txt
5
 */
6
namespace drycart\data\tests;
7
use drycart\data\DataWrapper;
8
9
/**
10
 * @author mendel
11
 */
12
class DataWrapperTest extends \PHPUnit\Framework\TestCase
13
{
14
    protected function prepareWrapper(bool $safe, ?string $titleKey = null) : DataWrapper
15
    {
16
        $data = [
17
            'field1'=>'value1',
18
            'field2'=>'value2',
19
            'obj'=>(object) ['field1'=>'value1','field2'=>'value2'],
20
            'array'=>['field1'=>'value1','field2'=>'value2'],
21
            'arrayObj'=> new \ArrayObject(['field1'=>'value1','field2'=>'value2'])
22
        ];
23
        return new DataWrapper($data, $safe, $titleKey);
24
    }
25
    
26
    public function testSafe()
27
    {
28
        $wrapper = $this->prepareWrapper(TRUE);
29
        //
30
        $this->assertEquals($wrapper['field1'], 'value1');
31
        $this->assertEquals($wrapper['obj.field2'], 'value2');
32
        $this->assertEquals($wrapper['array.field1'], 'value1');
33
        $this->assertEquals($wrapper['arrayObj.field1'], 'value1');
34
        $this->assertEquals($wrapper['arrayObj.count()'], 2);
35
        //
36
        $this->expectException(\UnexpectedValueException::class);
37
        $this->expectExceptionMessage("Bad field name notExistField");        
38
        $wrapper['obj.notExistField'];
39
    }
40
    
41
    public function testNotSafe()
42
    {
43
        $wrapper = $this->prepareWrapper(FALSE);
44
        //
45
        $this->assertEquals($wrapper['field1'], 'value1');
46
        $this->assertEquals($wrapper['obj.field2'], 'value2');
47
        $this->assertEquals($wrapper['array.field1'], 'value1');
48
        $this->assertEquals($wrapper['arrayObj.field1'], 'value1');
49
        $this->assertEquals($wrapper['arrayObj.count()'], 2);
50
        //
51
        $this->assertEquals($wrapper['obj.notExistField'], null);
52
        $this->assertEquals($wrapper['obj.notExistMethod()'], null);
53
    }
54
    
55
    public function testMagic()
56
    {
57
        $wrapper = $this->prepareWrapper(FALSE);
58
        //
59
        $field2 = 'arrayObj.field1';
60
        $field3 = 'arrayObj.count()';
61
        $this->assertEquals($wrapper->field1, 'value1');
62
        $this->assertEquals($wrapper->$field2, 'value1');
63
        $this->assertEquals($wrapper->$field3, 2);
64
        $this->assertEquals($wrapper['field1'], 'value1');
65
        $this->assertEquals($wrapper[$field2], 'value1');
66
        $this->assertEquals($wrapper[$field3], 2);
67
        
68
        $this->assertFalse(isset($wrapper->notExistField));
69
        $this->assertTrue(isset($wrapper->field1));
70
        $this->assertFalse(isset($wrapper['notExistField']));
71
        $this->assertTrue(isset($wrapper['field1']));
72
        
73
        $this->assertEquals($wrapper['field1'], 'value1');
74
        unset($wrapper['field1']);
75
        $this->assertNull($wrapper['field1']);
76
        
77
        $wrapper['someField'] = 'some string';
78
        $this->assertEquals('some string', $wrapper['someField']);
79
        
80
        $this->assertEquals($wrapper->arrayObj->count(), 2);
81
        $wrapper2 = new DataWrapper(new \ArrayObject(['field1'=>'value1','field2'=>'value2']));
82
        $this->assertEquals($wrapper2->count(), 2);
83
        $this->assertEquals(json_encode(['field1'=>'value1','field2'=>'value2']), json_encode($wrapper2));
84
        
85
        $wrapper3 = new DataWrapper(new dummy\DummyModel(), false);
86
        $this->assertEquals($wrapper3->getSomeString(), 'some string');
87
        
88
        $wrapper3['someField'] = 'some string3';
89
        $this->assertEquals('some string3', $wrapper3['someField']);
90
        unset($wrapper3['someField']);
91
        $this->assertNull($wrapper3['someField']);
92
        
93
        $this->assertEquals('Array obj count', $wrapper->fieldLabel($field3));
94
        $wrapper4 = new DataWrapper($wrapper);
95
        $this->assertEquals('Array obj count', $wrapper4->fieldLabel($field3));
96
        
97
        $this->expectException(\UnexpectedValueException::class);
98
        $this->expectExceptionMessage("DataWraper can wrap only array or object");        
99
        new DataWrapper('some string');
100
    }
101
    
102
    public function testIterator()
103
    {
104
        $wrapper = $this->prepareWrapper(FALSE);
105
        $array = iterator_to_array($wrapper);
106
        $this->assertArrayHasKey('field1', $array);
107
        $this->assertEquals('value1',$array['field1']);
108
        
109
        $wrapper2 = new DataWrapper(new \ArrayObject(['field1'=>'value1']));
110
        $array2 = iterator_to_array($wrapper2);
111
        $this->assertArrayHasKey('field1', $array2);
112
        $this->assertEquals('value1',$array2['field1']);
113
        
114
        $wrapper3 = new DataWrapper((object) ['field1'=>'value1']);
115
        $array3 = iterator_to_array($wrapper3);
116
        $this->assertArrayHasKey('field1', $array3);
117
        $this->assertEquals('value1',$array3['field1']);
118
    }
119
    
120
    public function testKeys()
121
    {
122
        $wrapper = $this->prepareWrapper(FALSE);
123
        $this->assertEquals([
124
            'field1','field2','obj','array','arrayObj'
125
        ],$wrapper->keys());
126
        
127
        $wrapper2 = new DataWrapper(new \ArrayObject(['field1'=>'value1']));
128
        $this->assertEquals([
129
            'field1'
130
        ],$wrapper2->keys());
131
        
132
        $wrapper3 = new DataWrapper((object) ['field1'=>'value1']);
133
        $this->assertEquals([
134
            'field1'
135
        ],$wrapper3->keys());
136
        
137
        $arrayObj = new \ArrayObject(['field1'=>'value1']);
138
        $wrapper4 = new DataWrapper($arrayObj->getIterator());
139
        $this->assertEquals([
140
            'field1'
141
        ],$wrapper4->keys());
142
        
143
        $wrapper5 = new DataWrapper($wrapper2);
144
        $this->assertEquals([
145
            'field1'
146
        ],$wrapper5->keys());
147
    }
148
    
149
    public function testTitle()
150
    {
151
        $wrapper0 = $this->prepareWrapper(FALSE);
152
        $this->assertEquals('Some array...',$wrapper0->title());
153
        
154
        $wrapper1 = $this->prepareWrapper(FALSE, 'field1');
155
        $this->assertEquals('value1',$wrapper1->title());
156
        
157
        $arrayObj = new \ArrayObject(['field1'=>'value1']);
158
        $wrapper2 = new DataWrapper($arrayObj);
159
        $this->assertEquals('Object #'.spl_object_id($arrayObj),$wrapper2->title());
160
        
161
        $wrapper3 = new DataWrapper($wrapper2);
162
        $this->assertEquals('Object #'.spl_object_id($arrayObj),$wrapper3->title());
163
    }
164
    
165
    public function testFieldsInfo()
166
    {
167
        $wrapper = $this->prepareWrapper(FALSE);
168
        $this->assertEquals([
169
            'field1'=>[],'field2'=>[],'obj'=>[],'array'=>[],'arrayObj'=>[]
170
        ],$wrapper->fieldsInfo());
171
        
172
        $wrapper2 = new DataWrapper($wrapper);
173
        $this->assertEquals([
174
            'field1'=>[],'field2'=>[],'obj'=>[],'array'=>[],'arrayObj'=>[]
175
        ],$wrapper2->fieldsInfo());
176
    }
177
}
178