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