1--TEST--
2disabled php only for class unpacker (ini_set)
3--SKIPIF--
4--FILE--
5<?php
6if(!extension_loaded('msgpack')) {
7    dl('msgpack.' . PHP_SHLIB_SUFFIX);
8}
9
10ini_set('msgpack.php_only', 0);
11
12function test($type, $variable, $test = null)
13{
14    $msgpack = new MessagePack();
15
16    $serialized = $msgpack->pack($variable);
17
18    $unpacker = new MessagePackUnpacker();
19
20    $length = strlen($serialized);
21
22    if (rand(0, 1))
23    {
24        for ($i = 0; $i < $length;)
25        {
26            $len = rand(1, 10);
27            $str = substr($serialized, $i, $len);
28
29            $unpacker->feed($str);
30            if ($unpacker->execute())
31            {
32                $unserialized = $unpacker->data();
33                var_dump($unserialized);
34                $unpacker->reset();
35            }
36
37            $i += $len;
38        }
39    }
40    else
41    {
42        $str = "";
43        $offset = 0;
44
45        for ($i = 0; $i < $length;)
46        {
47            $len = rand(1, 10);
48            $str .= substr($serialized, $i, $len);
49
50            if ($unpacker->execute($str, $offset))
51            {
52                $unserialized = $unpacker->data();
53                var_dump($unserialized);
54
55                $unpacker->reset();
56                $str = "";
57                $offset = 0;
58            }
59
60            $i += $len;
61        }
62    }
63
64    if (!is_bool($test))
65    {
66        echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL;
67    }
68    else
69    {
70        echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL;
71    }
72}
73
74test('null', null);
75
76test('bool: true', true);
77test('bool: false', false);
78
79test('zero: 0', 0);
80test('small: 1', 1);
81test('small: -1', -1);
82test('medium: 1000', 1000);
83test('medium: -1000', -1000);
84test('large: 100000', 100000);
85test('large: -100000', -100000);
86
87test('double: 123.456', 123.456);
88
89test('empty: ""', "");
90test('string: "foobar"', "foobar");
91
92test('array: empty', array(), false);
93test('array(1, 2, 3)', array(1, 2, 3), false);
94test('array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false);
95
96test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false);
97test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false);
98test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false);
99test('array("" => "empty")', array("" => "empty"), false);
100
101$a = array('foo');
102test('array($a, $a)', array($a, $a), false);
103test('array(&$a, &$a)', array(&$a, &$a), false);
104
105$a = array(null);
106$b = array(&$a);
107$a[0] = &$b;
108
109test('cyclic', $a, true);
110
111$a = array(
112    'a' => array(
113        'b' => 'c',
114        'd' => 'e'
115        ),
116    'f' => array(
117        'g' => 'h'
118        )
119    );
120
121test('array', $a, false);
122
123class Obj {
124    public $a;
125    protected $b;
126    private $c;
127
128    function __construct($a, $b, $c) {
129        $this->a = $a;
130        $this->b = $b;
131        $this->c = $c;
132    }
133}
134
135test('object', new Obj(1, 2, 3), true);
136
137test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), true);
138
139$o = new Obj(1, 2, 3);
140
141test('object', array(&$o, &$o), true);
142--EXPECTF--
143NULL
144OK
145bool(true)
146OK
147bool(false)
148OK
149int(0)
150OK
151int(1)
152OK
153int(-1)
154OK
155int(1000)
156OK
157int(-1000)
158OK
159int(100000)
160OK
161int(-100000)
162OK
163float(123.456)
164OK
165string(0) ""
166OK
167string(6) "foobar"
168OK
169array(0) {
170}
171OK
172array(3) {
173  [0]=>
174  int(1)
175  [1]=>
176  int(2)
177  [2]=>
178  int(3)
179}
180OK
181array(3) {
182  [0]=>
183  array(3) {
184    [0]=>
185    int(1)
186    [1]=>
187    int(2)
188    [2]=>
189    int(3)
190  }
191  [1]=>
192  array(3) {
193    [0]=>
194    int(4)
195    [1]=>
196    int(5)
197    [2]=>
198    int(6)
199  }
200  [2]=>
201  array(3) {
202    [0]=>
203    int(7)
204    [1]=>
205    int(8)
206    [2]=>
207    int(9)
208  }
209}
210OK
211array(3) {
212  [0]=>
213  string(3) "foo"
214  [1]=>
215  string(3) "foo"
216  [2]=>
217  string(3) "foo"
218}
219OK
220array(2) {
221  ["one"]=>
222  int(1)
223  ["two"]=>
224  int(2)
225}
226OK
227array(2) {
228  ["kek"]=>
229  string(3) "lol"
230  ["lol"]=>
231  string(3) "kek"
232}
233OK
234array(1) {
235  [""]=>
236  string(5) "empty"
237}
238OK
239array(2) {
240  [0]=>
241  array(1) {
242    [0]=>
243    string(3) "foo"
244  }
245  [1]=>
246  array(1) {
247    [0]=>
248    string(3) "foo"
249  }
250}
251OK
252array(2) {
253  [0]=>
254  array(1) {
255    [0]=>
256    string(3) "foo"
257  }
258  [1]=>
259  array(1) {
260    [0]=>
261    string(3) "foo"
262  }
263}
264OK
265array(1) {
266  [0]=>
267  array(1) {
268    [0]=>
269    array(1) {
270      [0]=>
271      NULL
272    }
273  }
274}
275OK
276array(2) {
277  ["a"]=>
278  array(2) {
279    ["b"]=>
280    string(1) "c"
281    ["d"]=>
282    string(1) "e"
283  }
284  ["f"]=>
285  array(1) {
286    ["g"]=>
287    string(1) "h"
288  }
289}
290OK
291array(3) {
292  [0]=>
293  int(1)
294  [1]=>
295  int(2)
296  [2]=>
297  int(3)
298}
299OK
300array(2) {
301  [0]=>
302  array(3) {
303    [0]=>
304    int(1)
305    [1]=>
306    int(2)
307    [2]=>
308    int(3)
309  }
310  [1]=>
311  array(3) {
312    [0]=>
313    int(4)
314    [1]=>
315    int(5)
316    [2]=>
317    int(6)
318  }
319}
320OK
321array(2) {
322  [0]=>
323  array(3) {
324    [0]=>
325    int(1)
326    [1]=>
327    int(2)
328    [2]=>
329    int(3)
330  }
331  [1]=>
332  array(3) {
333    [0]=>
334    int(1)
335    [1]=>
336    int(2)
337    [2]=>
338    int(3)
339  }
340}
341OK
342