Add support for i8
[plcapi.git] / tests / 1ParsingBugsTest.php
index 33915ca..343fcb0 100644 (file)
@@ -5,15 +5,48 @@
 include_once __DIR__ . '/../lib/xmlrpc.inc';
 include_once __DIR__ . '/../lib/xmlrpcs.inc';
 
+include_once __DIR__ . '/parse_args.php';
+
+/**
+ * Tests involving parsing of xml and handling of xmlrpc values
+ */
 class ParsingBugsTests extends PHPUnit_Framework_TestCase
 {
+    public $args = array();
+
+    protected function setUp()
+    {
+        $this->args = argParser::getArgs();
+        if ($this->args['DEBUG'] == 1)
+            ob_start();
+    }
+
+    protected function tearDown()
+    {
+        if ($this->args['DEBUG'] != 1)
+            return;
+        $out = ob_get_clean();
+        $status = $this->getStatus();
+        if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
+            || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
+            echo $out;
+        }
+    }
+
+    protected function newMsg($methodName, $params = array())
+    {
+        $msg = new xmlrpcmsg($methodName, $params);
+        $msg->setDebug($this->args['DEBUG']);
+        return $msg;
+    }
+
     public function testMinusOneString()
     {
         $v = new xmlrpcval('-1');
         $u = new xmlrpcval('-1', 'string');
         $t = new xmlrpcval(-1, 'string');
-        $this->assertEquals($u->scalarval(), $v->scalarval());
-        $this->assertEquals($t->scalarval(), $v->scalarval());
+        $this->assertEquals($v->scalarval(), $u->scalarval());
+        $this->assertEquals($v->scalarval(), $t->scalarval());
     }
 
     /**
@@ -21,8 +54,8 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
      */
     public function testMinusOneInt()
     {
-        $v = new xmlrpcval(-1);
         $u = new xmlrpcval();
+        $v = new xmlrpcval(-1);
         $this->assertEquals($u->scalarval(), $v->scalarval());
     }
 
@@ -32,10 +65,10 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
         $v = array($str => new xmlrpcval(1));
         $r = new xmlrpcresp(new xmlrpcval($v, 'struct'));
         $r = $r->serialize();
-        $m = new xmlrpcmsg('dummy');
+        $m = $this->newMsg('dummy');
         $r = $m->parseResponse($r);
         $v = $r->value();
-        $this->assertEquals($v->structmemexists($str), true);
+        $this->assertEquals(true, $v->structmemexists($str));
     }
 
     public function testUnicodeInErrorString()
@@ -62,7 +95,7 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
 </value>
 </fault>
 </methodResponse>');
-        $m = new xmlrpcmsg('dummy');
+        $m = $this->newMsg('dummy');
         $r = $m->parseResponse($response);
         $v = $r->faultString();
         $this->assertEquals(chr(224) . chr(252) . chr(232) . chr(224) . chr(252) . chr(232), $v);
@@ -70,7 +103,7 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
 
     public function testValidNumbers()
     {
-        $m = new xmlrpcmsg('dummy');
+        $m = $this->newMsg('dummy');
         $fp =
             '<?xml version="1.0"?>
 <methodResponse>
@@ -83,14 +116,18 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
 <value><int>01</int></value>
 </member>
 <member>
-<name>float1</name>
-<value><double>01.10</double></value>
-</member>
-<member>
 <name>integer2</name>
 <value><int>+1</int></value>
 </member>
 <member>
+<name>integer3</name>
+<value><i4>1</i4></value>
+</member>
+<member>
+<name>float1</name>
+<value><double>01.10</double></value>
+</member>
+<member>
 <name>float2</name>
 <value><double>+1.10</double></value>
 </member>
@@ -106,15 +143,49 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
         $r = $m->parseResponse($fp);
         $v = $r->value();
         $s = $v->structmem('integer1');
-        $t = $v->structmem('float1');
-        $u = $v->structmem('integer2');
-        $w = $v->structmem('float2');
-        $x = $v->structmem('float3');
+        $t = $v->structmem('integer2');
+        $u = $v->structmem('integer3');
+        $x = $v->structmem('float1');
+        $y = $v->structmem('float2');
+        $z = $v->structmem('float3');
         $this->assertEquals(1, $s->scalarval());
-        $this->assertEquals(1.1, $t->scalarval());
+        $this->assertEquals(1, $t->scalarval());
         $this->assertEquals(1, $u->scalarval());
-        $this->assertEquals(1.1, $w->scalarval());
-        $this->assertEquals(-110.0, $x->scalarval());
+
+        $this->assertEquals(1.1, $x->scalarval());
+        $this->assertEquals(1.1, $y->scalarval());
+        $this->assertEquals(-110.0, $z->scalarval());
+    }
+
+    public function testI8()
+    {
+        if (PHP_INT_SIZE == 4 ) {
+            $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
+            return;
+        }
+
+        $m = $this->newMsg('dummy');
+        $fp =
+            '<?xml version="1.0"?>
+<methodResponse>
+<params>
+<param>
+<value>
+<struct>
+<member>
+<name>integer1</name>
+<value><i8>1</i8></value>
+</member>
+</member>
+</struct>
+</value>
+</param>
+</params>
+</methodResponse>';
+        $r = $m->parseResponse($fp);
+        $v = $r->value();
+        $s = $v->structmem('integer1');
+        $this->assertEquals(1, $s->scalarval());
     }
 
     public function testAddScalarToStruct()
@@ -193,8 +264,7 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
 
     public function testBrokenResponses()
     {
-        $m = new xmlrpcmsg('dummy');
-        //$m->debug = 1;
+        $m = $this->newMsg('dummy');
         // omitting the 'params' tag: no more tolerated by the lib...
         $f = '<?xml version="1.0"?>
 <methodResponse>
@@ -226,7 +296,7 @@ class ParsingBugsTests extends PHPUnit_Framework_TestCase
 
     public function testBuggyHttp()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = 'HTTP/1.1 100 Welcome to the jungle
 
 HTTP/1.0 200 OK
@@ -253,7 +323,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testStringBug()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?>
 <!-- $Id -->
 <!-- found by 2z69xks7bpy001@sneakemail.com, amongst others
@@ -289,7 +359,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testWhiteSpace()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
 <member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
 
@@ -304,7 +374,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testDoubleDataInArrayTag()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?><methodResponse><params><param><value><array>
 <data></data>
 <data></data>
@@ -325,7 +395,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testDoubleStuffInValueTag()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?><methodResponse><params><param><value>
 <string>hello world</string>
 <array><data></data></array>
@@ -354,7 +424,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testAutodecodeResponse()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
 <member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
 
@@ -369,7 +439,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testNoDecodeResponse()
     {
-        $s = new xmlrpcmsg('dummy');
+        $s = $this->newMsg('dummy');
         $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
 <member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
 
@@ -413,52 +483,56 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
 
     public function testUTF8Response()
     {
-        $s = new xmlrpcmsg('dummy');
+        $string = chr(224) . chr(252) . chr(232);
+
+        $s = $this->newMsg('dummy');
         $f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=UTF-8\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode('������') . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
 ';
         $r = $s->parseResponse($f, false, 'phpvals');
         $v = $r->value();
         $v = $v['content'];
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
 
-        $f = '<?xml version="1.0" encoding="utf-8"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode('������') . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+        $f = '<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
 ';
         $r = $s->parseResponse($f, false, 'phpvals');
         $v = $r->value();
         $v = $v['content'];
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
 
         $r = php_xmlrpc_decode_xml($f);
         $v = $r->value();
         $v = $v->structmem('content')->scalarval();
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
     }
 
     public function testLatin1Response()
     {
-        $s = new xmlrpcmsg('dummy');
+        $string = chr(224) . chr(252) . chr(232);
+
+        $s = $this->newMsg('dummy');
         $f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=ISO-8859-1\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . '������' . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
 ';
         $r = $s->parseResponse($f, false, 'phpvals');
         $v = $r->value();
         $v = $v['content'];
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
 
-        $f = '<?xml version="1.0" encoding="iso-8859-1"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . '������' . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+        $f = '<?xml version="1.0" encoding="ISO-8859-1"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
 ';
         $r = $s->parseResponse($f, false, 'phpvals');
         $v = $r->value();
         $v = $v['content'];
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
 
         $r = php_xmlrpc_decode_xml($f);
         $v = $r->value();
         $v = $v->structmem('content')->scalarval();
-        $this->assertEquals("������", $v);
+        $this->assertEquals($string, $v);
     }
 
     public function testUTF8IntString()
@@ -490,7 +564,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
         $v = new xmlrpcval('hello', 'null');
         $r = new xmlrpcresp($v);
         $s = $r->serialize();
-        $m = new xmlrpcmsg('dummy');
+        $m = $this->newMsg('dummy');
         $r = $m->parseresponse($s);
         $this->assertequals(2, $r->faultCode());
         // enable reception of nil values
@@ -518,7 +592,7 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
         $this->assertequals(2, $r->faultCode());
     }
 
-    public function TestLocale()
+    public function testLocale()
     {
         $locale = setlocale(LC_NUMERIC, 0);
         /// @todo on php 5.3/win setting locale to german does not seem to set decimal separator to comma...
@@ -536,4 +610,31 @@ and there they were.</value></member><member><name>postid</name><value>7414222</
             $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
         }
     }
+
+    public function testArrayAccess()
+    {
+        $v1 = new xmlrpcval(array(new xmlrpcval('one'), new xmlrpcval('two')), 'array');
+        $this->assertequals(1, count($v1));
+        $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
+        foreach($v1 as $key => $val)
+        {
+            $expected = each($out);
+            $this->assertequals($expected['key'], $key);
+            if (gettype($expected['value']) == 'array') {
+                $this->assertequals('array', gettype($val));
+            } else {
+                $this->assertequals($expected['value'], $val);
+            }
+        }
+
+        $v2 = new \PhpXmlRpc\Value(array(new \PhpXmlRpc\Value('one'), new \PhpXmlRpc\Value('two')), 'array');
+        $this->assertequals(2, count($v2));
+        $out = array(0 => 'object', 1 => 'object');
+        foreach($v2 as $key => $val)
+        {
+            $expected = each($out);
+            $this->assertequals($expected['key'], $key);
+            $this->assertequals($expected['value'], gettype($val));
+        }
+    }
 }