From ca6e9643ea39dbe4bfe2041f6f6f4df0b3a05f4a Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Sat, 29 Dec 2012 12:21:13 +0100
Subject: [PATCH] Fix: Pb in json function for objects

---
 htdocs/core/lib/json.lib.php   |  10 ++-
 test/phpunit/AllTests.php      |   2 +
 test/phpunit/FilesLibTest.php  | 119 ++++++++++++++----------
 test/phpunit/FunctionsTest.php |  32 -------
 test/phpunit/JsonLibTest.php   | 160 +++++++++++++++++++++++++++++++++
 5 files changed, 244 insertions(+), 79 deletions(-)
 create mode 100755 test/phpunit/JsonLibTest.php

diff --git a/htdocs/core/lib/json.lib.php b/htdocs/core/lib/json.lib.php
index 73907fd5f23..8b1328ae8c0 100644
--- a/htdocs/core/lib/json.lib.php
+++ b/htdocs/core/lib/json.lib.php
@@ -45,7 +45,13 @@ if (! function_exists('json_encode'))
  */
 function dol_json_encode($elements)
 {
-	$num = count($elements);
+	$num=count($elements);
+	if (is_object($elements))	// Count number of properties for an object
+	{
+		$num=0;
+		foreach($elements as $key => $value) $num++;
+	}
+	//var_dump($num);
 
 	// determine type
 	if (is_numeric(key($elements)))
@@ -56,7 +62,7 @@ function dol_json_encode($elements)
 		{
 			if (is_array($elements[$i]) || is_object($elements[$i])) $output.= json_encode($elements[$i]);
 			else $output .= _val($elements[$i]);
-			if($i !== $last) $output.= ',';
+			if ($i !== $last) $output.= ',';
 		}
 		$output.= ']';
 	}
diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php
index 0d81438bd3c..cc11e42e93e 100644
--- a/test/phpunit/AllTests.php
+++ b/test/phpunit/AllTests.php
@@ -68,6 +68,8 @@ class AllTests
 		$suite->addTestSuite('DateLibTest');
 		require_once dirname(__FILE__).'/FilesLibTest.php';
 		$suite->addTestSuite('FilesLibTest');
+		require_once dirname(__FILE__).'/JsonLibTest.php';
+		$suite->addTestSuite('JsonLibTest');
 		require_once dirname(__FILE__).'/ImagesLibTest.php';
 		$suite->addTestSuite('ImagesLibTest');
 		require_once dirname(__FILE__).'/FunctionsTest.php';
diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php
index 9b66ff96aee..ecbad4050bc 100644
--- a/test/phpunit/FilesLibTest.php
+++ b/test/phpunit/FilesLibTest.php
@@ -224,10 +224,81 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
         return $result;
     }
 
+    /**
+     * testDolMimeType
+     *
+     * @return	string
+     */
+    public function testDolMimeType()
+    {
+    	global $conf,$user,$langs,$db;
+    	$conf=$this->savconf;
+    	$user=$this->savuser;
+    	$langs=$this->savlangs;
+    	$db=$this->savdb;
+
+    	// file.png
+    	$result=dol_mimetype('file.png','',0);
+    	$this->assertEquals('image/png',$result);
+    	$result=dol_mimetype('file.png','',1);
+    	$this->assertEquals('png',$result);
+    	$result=dol_mimetype('file.png','',2);
+    	$this->assertEquals('image.png',$result);
+    	$result=dol_mimetype('file.png','',3);
+    	$this->assertEquals('',$result);
+    	// file.odt
+    	$result=dol_mimetype('file.odt','',0);
+    	$this->assertEquals('application/vnd.oasis.opendocument.text',$result);
+    	$result=dol_mimetype('file.odt','',1);
+    	$this->assertEquals('vnd.oasis.opendocument.text',$result);
+    	$result=dol_mimetype('file.odt','',2);
+    	$this->assertEquals('ooffice.png',$result);
+    	$result=dol_mimetype('file.odt','',3);
+    	$this->assertEquals('',$result);
+    	// file.php
+    	$result=dol_mimetype('file.php','',0);
+    	$this->assertEquals('text/plain',$result);
+    	$result=dol_mimetype('file.php','',1);
+    	$this->assertEquals('plain',$result);
+    	$result=dol_mimetype('file.php','',2);
+    	$this->assertEquals('php.png',$result);
+    	$result=dol_mimetype('file.php','',3);
+    	$this->assertEquals('php',$result);
+    	// file.php.noexe
+    	$result=dol_mimetype('file.php.noexe','',0);
+    	$this->assertEquals('text/plain',$result);
+    }
+
+
+    /**
+     * testDolDeleteDir
+     *
+     * @return	int
+     */
+    public function testDolDeleteDir()
+    {
+    	global $conf,$user,$langs,$db;
+    	$conf=$this->savconf;
+    	$user=$this->savuser;
+    	$langs=$this->savlangs;
+    	$db=$this->savdb;
+
+    	$dirout=$conf->admin->dir_temp.'/test';
+
+    	$count=0;
+    	$result=dol_delete_dir_recursive($dirout,$count,1);	// If it has no permission to delete, it will fails as if dir does not exists, so we can't test it
+    	print __METHOD__." result=".$result."\n";
+    	$this->assertGreaterThanOrEqual(0,$result);
+    }
+
+
     /**
      * testDolCopyMoveDelete
      *
      * @return	int
+     *
+     * @depends	testDolDeleteDir
+     * The depends says test is run only if previous is ok
      */
     public function testDolCopyMoveDelete()
     {
@@ -272,55 +343,13 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($result);
     }
 
-    /**
-     * testDolMimeType
-     *
-     * @return	string
-     */
-    public function testDolMimeType()
-    {
-        global $conf,$user,$langs,$db;
-        $conf=$this->savconf;
-        $user=$this->savuser;
-        $langs=$this->savlangs;
-        $db=$this->savdb;
-
-		// file.png
-		$result=dol_mimetype('file.png','',0);
-        $this->assertEquals('image/png',$result);
-		$result=dol_mimetype('file.png','',1);
-        $this->assertEquals('png',$result);
-		$result=dol_mimetype('file.png','',2);
-		$this->assertEquals('image.png',$result);
-		$result=dol_mimetype('file.png','',3);
-        $this->assertEquals('',$result);
-		// file.odt
-		$result=dol_mimetype('file.odt','',0);
-        $this->assertEquals('application/vnd.oasis.opendocument.text',$result);
-		$result=dol_mimetype('file.odt','',1);
-        $this->assertEquals('vnd.oasis.opendocument.text',$result);
-		$result=dol_mimetype('file.odt','',2);
-		$this->assertEquals('ooffice.png',$result);
-		$result=dol_mimetype('file.odt','',3);
-        $this->assertEquals('',$result);
-		// file.php
-		$result=dol_mimetype('file.php','',0);
-        $this->assertEquals('text/plain',$result);
-		$result=dol_mimetype('file.php','',1);
-        $this->assertEquals('plain',$result);
-		$result=dol_mimetype('file.php','',2);
-		$this->assertEquals('php.png',$result);
-		$result=dol_mimetype('file.php','',3);
-        $this->assertEquals('php',$result);
-		// file.php.noexe
-		$result=dol_mimetype('file.php.noexe','',0);
-        $this->assertEquals('text/plain',$result);
-    }
-
     /**
      * testDolCompressUnCompress
      *
      * @return	string
+     *
+     * @depends	testDolCopyMoveDelete
+     * The depends says test is run only if previous is ok
      */
     public function testDolCompressUnCompress()
     {
diff --git a/test/phpunit/FunctionsTest.php b/test/phpunit/FunctionsTest.php
index 92400d36e9f..6efbb176dbb 100755
--- a/test/phpunit/FunctionsTest.php
+++ b/test/phpunit/FunctionsTest.php
@@ -28,7 +28,6 @@ global $conf,$user,$langs,$db;
 require_once 'PHPUnit/Autoload.php';
 require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
 require_once dirname(__FILE__).'/../../htdocs/core/lib/date.lib.php';
-require_once dirname(__FILE__).'/../../htdocs/core/lib/json.lib.php';
 
 if (! defined('NOREQUIREUSER'))  define('NOREQUIREUSER','1');
 if (! defined('NOREQUIREDB'))    define('NOREQUIREDB','1');
@@ -478,37 +477,6 @@ class FunctionsTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($verifcond);
     }
 
-    /**
-     * testJsonencode
-     *
-     * @return	void
-     */
-    public function testJsonEncode()
-    {
-        //$this->sharedFixture
-        global $conf,$user,$langs,$db;
-        $this->savconf=$conf;
-        $this->savuser=$user;
-        $this->savlangs=$langs;
-        $this->savdb=$db;
-
-        $arraytotest=array(0=>array('key'=>1,'value'=>'PRODREF','label'=>'Product ref with é and special chars \\ \' "'));
-
-        $encoded=json_encode($arraytotest);
-        //var_dump($encoded);
-        $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded);
-        $decoded=json_decode($encoded,true);
-        //var_dump($decoded);
-        $this->assertEquals($arraytotest,$decoded);
-
-        $encoded=dol_json_encode($arraytotest);
-        //var_dump($encoded);
-        $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded);
-        $decoded=dol_json_decode($encoded,true);
-        //var_dump($decoded);
-        $this->assertEquals($arraytotest,$decoded);
-    }
-
     /**
      * testGetDefaultTva
      *
diff --git a/test/phpunit/JsonLibTest.php b/test/phpunit/JsonLibTest.php
new file mode 100755
index 00000000000..8a174fcb84d
--- /dev/null
+++ b/test/phpunit/JsonLibTest.php
@@ -0,0 +1,160 @@
+<?php
+/* Copyright (C) 2010-2012 Laurent Destailleur  <eldy@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * or see http://www.gnu.org/
+ */
+
+/**
+ *      \file       test/phpunit/JsonLibTest.php
+ *		\ingroup    test
+ *      \brief      PHPUnit test
+ *		\remarks	To run this script as CLI:  phpunit filename.php
+ */
+
+global $conf,$user,$langs,$db;
+//define('TEST_DB_FORCE_TYPE','mysql');	// This is to force using mysql driver
+require_once 'PHPUnit/Autoload.php';
+require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
+require_once dirname(__FILE__).'/../../htdocs/core/lib/json.lib.php';
+
+if (! defined('NOREQUIREUSER'))  define('NOREQUIREUSER','1');
+if (! defined('NOREQUIREDB'))    define('NOREQUIREDB','1');
+if (! defined('NOREQUIRESOC'))   define('NOREQUIRESOC','1');
+if (! defined('NOREQUIRETRAN'))  define('NOREQUIRETRAN','1');
+if (! defined('NOCSRFCHECK'))    define('NOCSRFCHECK','1');
+if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1');
+if (! defined('NOREQUIREMENU'))  define('NOREQUIREMENU','1'); // If there is no menu to show
+if (! defined('NOREQUIREHTML'))  define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php
+if (! defined('NOREQUIREAJAX'))  define('NOREQUIREAJAX','1');
+if (! defined("NOLOGIN"))        define("NOLOGIN",'1');       // If this page is public (can be called outside logged session)
+
+
+/**
+ * Class for PHPUnit tests
+ *
+ * @backupGlobals disabled
+ * @backupStaticAttributes enabled
+ * @remarks	backupGlobals must be disabled to have db,conf,user and lang not erased.
+ */
+class JsonLibTest extends PHPUnit_Framework_TestCase
+{
+    protected $savconf;
+    protected $savuser;
+    protected $savlangs;
+    protected $savdb;
+
+    /**
+     * Constructor
+     * We save global variables into local variables
+     *
+     * @return CoreTest
+     */
+    function __construct()
+    {
+        //$this->sharedFixture
+        global $conf,$user,$langs,$db;
+        $this->savconf=$conf;
+        $this->savuser=$user;
+        $this->savlangs=$langs;
+        $this->savdb=$db;
+
+        print __METHOD__." db->type=".$db->type." user->id=".$user->id;
+        //print " - db ".$db->db;
+        print "\n";
+    }
+
+    // Static methods
+    public static function setUpBeforeClass()
+    {
+        global $conf,$user,$langs,$db;
+        //$db->begin();	// This is to have all actions inside a transaction even if test launched without suite.
+
+        print __METHOD__."\n";
+    }
+    public static function tearDownAfterClass()
+    {
+        global $conf,$user,$langs,$db;
+        //$db->rollback();
+
+        print __METHOD__."\n";
+    }
+
+	/**
+	 * Init phpunit tests
+	 *
+	 * @return	void
+	 */
+    protected function setUp()
+    {
+        global $conf,$user,$langs,$db;
+        $conf=$this->savconf;
+        $user=$this->savuser;
+        $langs=$this->savlangs;
+        $db=$this->savdb;
+
+        print __METHOD__."\n";
+    }
+	/**
+	 * End phpunit tests
+	 *
+	 * @return	void
+	 */
+    protected function tearDown()
+    {
+        print __METHOD__."\n";
+    }
+
+    /**
+     * testJsonEncode
+     *
+     * @return	void
+     */
+    public function testJsonEncode()
+    {
+        //$this->sharedFixture
+        global $conf,$user,$langs,$db;
+        $this->savconf=$conf;
+        $this->savuser=$user;
+        $this->savlangs=$langs;
+        $this->savdb=$db;
+
+        $arraytotest=array(0=>array('key'=>1,'value'=>'PRODREF','label'=>'Product ref with é and special chars \\ \' "'));
+
+        $encoded=json_encode($arraytotest);
+        //var_dump($encoded);
+        $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded);
+        $decoded=json_decode($encoded,true);
+        //var_dump($decoded);
+        $this->assertEquals($arraytotest,$decoded);
+
+        $encoded=dol_json_encode($arraytotest);
+        //var_dump($encoded);
+        $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded);
+        $decoded=dol_json_decode($encoded,true);
+        //var_dump($decoded);
+        $this->assertEquals($arraytotest,$decoded);
+
+        $now=gmmktime(12,0,0,1,1,1970);
+        $objecttotest=new stdClass();
+        $objecttotest->property1='abc';
+        $objecttotest->property2=1234;
+        $objecttotest->property3=$now;
+        $encoded=dol_json_encode($objecttotest);
+        $this->assertEquals('{"property1":"abc","property2":1234,"property3":43200}',$encoded);
+
+    }
+
+}
+?>
\ No newline at end of file
-- 
GitLab