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