]> gitweb.fluxo.info Git - semanticscuttle.git/commitdiff
Major refactoring: improve tests process. add a main file called allTests.php.
authormensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f>
Thu, 18 Dec 2008 10:59:43 +0000 (10:59 +0000)
committermensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f>
Thu, 18 Dec 2008 10:59:43 +0000 (10:59 +0000)
git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@203 b3834d28-1941-0410-a4f8-b48e95affb8f

tests/LAUNCH_TESTS
tests/allTests.php [new file with mode: 0644]
tests/bookmarksTest.php
tests/dox.html [new file with mode: 0644]
tests/tag2TagTest.php
tests/tagsCacheTest.php [new file with mode: 0644]
tests/tagsTest.php

index 531d239b56b621ff7baed0432999fc9426473edf..5fcc5596dfbd5925c1e84c9ecaed2e26d6e82276 100644 (file)
@@ -2,6 +2,6 @@ You need PHPunit.
 
 Then
 
-To launch the tests, put in a console situated in the root of the SEMANTICSCUTTLE project (where is the SEMANTICSCUTTLE config file):
+To launch the tests, type in a console situated in the root of the SEMANTICSCUTTLE project (where is the SEMANTICSCUTTLE config file):
 
-phpunit BookmarksTest ./tests/bookmarksTest.php ; phpunit CommonDescriptionTest tests/commonDescriptionTest.php ; phpunit Tag2TagTest tests/tag2TagTest.php ; phpunit SearchTest tests/searchTest.php ; phpunit TagsTest tests/tagsTest.php
+phpunit --testdox-html tests/dox.html AllTests tests/allTests.php
diff --git a/tests/allTests.php b/tests/allTests.php
new file mode 100644 (file)
index 0000000..843911c
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+* To launch all tests, type the following line into the root directory
+* of SemanticScuttle (where is the config.inc.php file) :
+* 
+*     phpunit --testdox-html tests/dox.html AllTests tests/allTests.php
+* 
+*  !!Check that $debugMode = false in config.inc.php to avoid unstable beahviours!!
+* 
+* A dox.html file will be created into the tests/ directory providing a summary
+* of tests according to agile development.
+* */
+
+class AllTests extends PHPUnit_Framework_TestSuite
+{
+    public static function suite()
+    {
+       $suite = new AllTests();
+       $suite->addTestFile('tests/bookmarksTest.php');
+       $suite->addTestFile('tests/tag2TagTest.php'); 
+       $suite->addTestFile('tests/tagsCacheTest.php');
+       $suite->addTestFile('tests/commonDescriptionTest.php');         
+       $suite->addTestFile('tests/searchTest.php'); 
+       $suite->addTestFile('tests/tagsTest.php');
+        return $suite;
+    }
+    protected function setUp()
+    {
+       global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix, $TEMPLATES_DIR, $filetypes, $debugMode;
+               require_once('./header.inc.php');
+    }
+    protected function tearDown()
+    {
+    }
+}
+?>
\ No newline at end of file
index 9c8e533c7a8b754f167380fce642915c200413ca..e229d5e21957b1f073322279790fa92472c4e569 100644 (file)
@@ -2,74 +2,74 @@
 require_once 'PHPUnit/Framework.php';
 
 /*
-To launch this test, type the following line into a shell
-at the root of the scuttlePlus directory :
-     phpunit BookmarksTest tests/bookmarksTest.php
-*/
+ To launch this test, type the following line into a shell
+ into the tests/ directory :
+     phpunit BookmarksTest tests/boomarksTest.php
+ */
 
 class BookmarksTest extends PHPUnit_Framework_TestCase
 {
-    protected $us;
-    protected $bs;
-    protected $ts;
-    protected $tts;
-    protected function setUp()
-    {
-        global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix;
-       require_once('./header.inc.php');
+       protected $us;
+       protected $bs;
+       protected $ts;
+       protected $tts;
 
-       $this->us =& ServiceFactory::getServiceInstance('UserService');
-       $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
-       $this->bs->deleteAll();
-       $this->b2ts=& ServiceFactory::getServiceInstance('Bookmark2TagService');
-       $this->b2ts->deleteAll();
-       $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
-       $this->tts->deleteAll(); 
-       $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
-       $this->tsts->deleteAll();
-    }
+       protected function setUp()
+       {
+               global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix, $TEMPLATES_DIR, $filetypes, $debugMode;
+               require_once('./header.inc.php');
 
-    public function testHardCharactersInBookmarks()
-    {
-       $bs = $this->bs;
-       $title = "title&é\"'(-è_çà)=";
-       $desc = "description#{[|`\^@]}³<> ¹¡÷׿&é\"'(-è\\_çà)=";
-       $tag1 = "#{|`^@]³¹¡¿<&é\"'(-è\\_çà)";   
-       $tag2 = "&é\"'(-è.[?./§!_çà)";
+               $this->us =& ServiceFactory::getServiceInstance('UserService');
+               $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
+               $this->bs->deleteAll();
+               $this->b2ts=& ServiceFactory::getServiceInstance('Bookmark2TagService');
+               $this->b2ts->deleteAll();
+               $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
+               $this->tts->deleteAll();
+               $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
+               $this->tsts->deleteAll();
+       }
 
-       $bs->addBookmark("http://site1.com", $title, $desc, "status", array($tag1, $tag2), null, false, false, 1);
+       public function testHardCharactersInBookmarks()
+       {               
+               $bs = $this->bs;
+               $title = "title&é\"'(-è_çà)=";
+               $desc = "description#{[|`\^@]}³<> ¹¡÷׿&é\"'(-è\\_çà)=";
+               $tag1 = "#{|`^@]³¹¡¿<&é\"'(-è\\_çà)";   
+               $tag2 = "&é\"'(-è.[?./§!_çà)";
 
-       $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0, $dtend);
+               $bs->addBookmark("http://site1.com", $title, $desc, "status", array($tag1, $tag2), null, false, false, 1);
 
-       $b0 = $bookmarks['bookmarks'][0];
-       $this->assertEquals($title, $b0['bTitle']);
-       $this->assertEquals($desc, $b0['bDescription']);
-       $this->assertEquals(str_replace(array('"', '\''), "_", $tag1), $b0['tags'][0]);
-       $this->assertEquals(str_replace(array('"', '\''), "_", $tag2), $b0['tags'][1]);
-    }
-    public function testUnificationOfBookmarks()
-    {
-       $bs = $this->bs;
+               $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0);
 
-       $bs->addBookmark("http://site1.com", "title", "description", "status", array('tag1'), null, false, false, 1);
-       $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('tag2'), null, false, false, 2);
+               $b0 = $bookmarks['bookmarks'][0];
+               $this->assertEquals($title, $b0['bTitle']);
+               $this->assertEquals($desc, $b0['bDescription']);
+               $this->assertEquals(str_replace(array('"', '\'', '/'), "_", $tag1), $b0['tags'][0]);
+               $this->assertEquals(str_replace(array('"', '\'', '/'), "_", $tag2), $b0['tags'][1]);
+       }
 
-       $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0, $dtend);
-       $this->assertEquals(1, $bookmarks['total']);
-    }
+       public function testUnificationOfBookmarks()
+       {               
+               $bs = $this->bs;
 
-    /*public function testSearchingBookmarksAccentsInsensible()
-    {
-       $bs = $this->bs;
+               $bs->addBookmark("http://site1.com", "title", "description", "status", array('tag1'), null, false, false, 1);
+               $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('tag2'), null, false, false, 2);
 
-       $bs->addBookmark("http://site1.com", "title", "éèüaàê", "status", array('tag1'), null, false, false, 1);
-       $bookmarks =& $bs->getBookmarks(0, NULL, NULL, NULL, $terms = "eeaae"); //void
-       $this->assertEquals(0, $bookmarks['total']);
-       $bookmarks =& $bs->getBookmarks(0, NULL, NULL, NULL, $terms = "eeuaae");
-       $this->assertEquals(1, $bookmarks['total']);
-    }*/
+               $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0);
+               $this->assertEquals(1, $bookmarks['total']);
+       }
+
+       /*public function testSearchingBookmarksAccentsInsensible()
+        {
+        $bs = $this->bs;
+
+        $bs->addBookmark("http://site1.com", "title", "éèüaàê", "status", array('tag1'), null, false, false, 1);
+        $bookmarks =& $bs->getBookmarks(0, NULL, NULL, NULL, $terms = "eeaae"); //void
+        $this->assertEquals(0, $bookmarks['total']);
+        $bookmarks =& $bs->getBookmarks(0, NULL, NULL, NULL, $terms = "eeuaae");
+        $this->assertEquals(1, $bookmarks['total']);
+        }*/
 
 }
 ?>
diff --git a/tests/dox.html b/tests/dox.html
new file mode 100644 (file)
index 0000000..98f6d00
--- /dev/null
@@ -0,0 +1 @@
+<html><body><h2>TagsCache</h2><ul>
\ No newline at end of file
index 3f686a49a203c3edab044b3217916e5b57baa4d6..8bb9ef3a030a8d8afed150787ca9a0dba80315a0 100644 (file)
 require_once 'PHPUnit/Framework.php';
 
 /*
-To launch this test, type the following line into a shell
-at the root of the scuttlePlus directory :
    phpunit Tag2TagTest tests/tag2TagTest.php
-*/
+ To launch this test, type the following line into a shell
+ at the root of the scuttlePlus directory :
+ phpunit Tag2TagTest tests/tag2TagTest.php
+ */
 
 class Tag2TagTest extends PHPUnit_Framework_TestCase
 {
-    protected $us;
-    protected $bs;
-    protected $b2ts;
-    protected $tts;
-    protected function setUp()
-    {
-        global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix;
-       require_once('./header.inc.php');
-
-       $this->us =& ServiceFactory::getServiceInstance('UserService');
-       $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
-       $this->bs->deleteAll();
-       $this->b2ts =& ServiceFactory::getServiceInstance('Bookmark2TagService');
-       $this->b2ts->deleteAll();
-       $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
-       $this->tts->deleteAll(); 
-       $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
-       $this->tsts->deleteAll();
-    }
-    public function testManipulateTag2TagRelationsOfInclusion()
-    {
-       $tts = $this->tts;
-
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('a', 'c', '>', 1);
-       $tts->addLinkedTags('a', 'd', '>', 20);
-       $tts->addLinkedTags('b', 'd', '>', 1);
-       $tts->addLinkedTags('d', 'e', '>', 1);
-       $tts->addLinkedTags('d', 'e', '>', 20);
-       $tts->addLinkedTags('f', 'g', '>', 20);
-
-       // basic test
-
-
-       $links = $tts->getLinks(1);
-       $this->assertEquals(4, count($links));
-
-       $allLinkedTags = $tts->getAllLinkedTags('e', '>', 1, true); // as flat list
-       $this->assertEquals(array(), $allLinkedTags);
-
-       $allLinkedTags = $tts->getAllLinkedTags('d', '>', 1, true); // as flat list
-       $this->assertEquals(array('e'), $allLinkedTags);
-
-       $allLinkedTags = $tts->getAllLinkedTags('b', '>', 1, true); // as flat list
-       $this->assertEquals(array('d', 'e'), $allLinkedTags);
-       $this->assertEquals(2, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-
-       $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1, true); // as flat list
-       $this->assertEquals(4, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('b', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-
-
-       // warning: we add recursive link
-       $tts->addLinkedTags('b', 'a', '>', 1); 
-
-       $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1, true); // as flat list
-       $this->assertEquals(4, sizeof($allLinkedTags));
-       //$this->assertTrue(in_array('a', $allLinkedTags));
-       $this->assertTrue(in_array('b', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-
-       $orphewTags = $tts->getOrphewTags('>', 1);
-       $this->assertEquals(0, sizeof($orphewTags));
-       $orphewTags = $tts->getOrphewTags('>', 20);
-       $this->assertEquals(2, sizeof($orphewTags));
-       $this->assertSame('a', $orphewTags[0]['tag']);
-       $this->assertSame('f', $orphewTags[1]['tag']);
-       $orphewTags = $tts->getOrphewTags('>');
-       $this->assertEquals(1, sizeof($orphewTags));
-       $this->assertSame('f', $orphewTags[0]['tag']);
-       
-       $linkedTags = $tts->getLinkedTags('a', '>');
-       $this->assertSame(array('b', 'c', 'd'), $linkedTags);
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertSame(array('b', 'c'), $linkedTags);
-       $tts->removeLinkedTags('a', 'b', '>', 1);
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertSame(array('c'), $linkedTags);
-       $tts->removeLinkedTags('a', 'c', '>', 1);
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertEquals(0, sizeof($linkedTags));
-    }
-
-    public function testManipulateTag2TagRelationsOfSynonym()
-    {
-       $tts = $this->tts;
-
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('b', 'c', '>', 1);
-       $tts->addLinkedTags('b', 'd', '=', 1);
-       $tts->addLinkedTags('d', 'e', '=', 1);
-       $tts->addLinkedTags('d', 'f', '=', 1);
-       $tts->addLinkedTags('e', 'g', '>', 1);
-
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertSame(array('b'), $linkedTags);
-
-       $linkedTags = $tts->getLinkedTags('a', '=', 1);
-       $this->assertSame(array(), $linkedTags);
-
-       $linkedTags = $tts->getLinkedTags('b', '=', 1);
-       $this->assertSame(array('d'), $linkedTags);
-
-       $linkedTags = $tts->getLinkedTags('d', '=', 1);
-       $this->assertEquals(3, sizeof($linkedTags));
-       $this->assertTrue(in_array('b', $linkedTags)); // '=' is bijective
-       $this->assertTrue(in_array('e', $linkedTags));
-       $this->assertTrue(in_array('f', $linkedTags));
-
-       $linkedTags = $tts->getLinkedTags('f', '=', 1);
-       $this->assertEquals(1, sizeof($linkedTags));
-       $this->assertTrue(in_array('d', $linkedTags)); // '=' is bijective
-
-       // test allLinkTags (with inference)
-       $allLinkedTags = $tts->getAllLinkedTags('a', '=', 1, true); // as flat list
-       $this->assertEquals(0, sizeof($allLinkedTags));
-
-       $allLinkedTags = $tts->getAllLinkedTags('b', '=', 1, true); // as flat list
-       $this->assertEquals(3, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-       $this->assertTrue(in_array('f', $allLinkedTags));
-
-       $allLinkedTags = $tts->getAllLinkedTags('f', '>', 1, true); // as flat list
-       $this->assertEquals(5, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('b', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('g', $allLinkedTags));
-
-       $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1, true); // as flat list
-       $this->assertEquals(6, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('b', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-       $this->assertTrue(in_array('f', $allLinkedTags));
-       $this->assertTrue(in_array('g', $allLinkedTags));
-
-       $tts->addLinkedTags('g', 'h', '>', 1);
-       $tts->addLinkedTags('i', 'h', '=', 1);
-       $tts->addLinkedTags('j', 'f', '>', 1);
-
-       $allLinkedTags = $tts->getAllLinkedTags('j', '>', 1, true); // as flat list
-       $this->assertEquals(8, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('b', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-       $this->assertTrue(in_array('f', $allLinkedTags));
-       $this->assertTrue(in_array('g', $allLinkedTags));
-       $this->assertTrue(in_array('h', $allLinkedTags));
-       $this->assertTrue(in_array('i', $allLinkedTags));
-
-       // complex case: test cycle
-       $tts->addLinkedTags('g', 'a', '>', 1);
-       $allLinkedTags = $tts->getAllLinkedTags('b', '>', 1, true); // as flat list
-       $this->assertEquals(8, sizeof($allLinkedTags));
-       $this->assertTrue(in_array('a', $allLinkedTags));
-       $this->assertTrue(in_array('c', $allLinkedTags));
-       $this->assertTrue(in_array('d', $allLinkedTags));
-       $this->assertTrue(in_array('e', $allLinkedTags));
-       $this->assertTrue(in_array('f', $allLinkedTags));
-       $this->assertTrue(in_array('g', $allLinkedTags));
-       $this->assertTrue(in_array('h', $allLinkedTags));
-       $this->assertTrue(in_array('i', $allLinkedTags));
-
-    }
-
-    // Test function that select the best tags to display? 
-    public function testViewTag2TagRelations()
-    {
-       $tts = $this->tts;
-
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('c', 'd', '>', 1);
-       $tts->addLinkedTags('d', 'e', '>', 1);
-       $tts->addLinkedTags('f', 'g', '>', 1);
-       $tts->addLinkedTags('f', 'h', '>', 1);
-       $tts->addLinkedTags('f', 'i', '>', 1);
-
-       $orphewTags = $tts->getOrphewTags('>', 1);
-       $this->assertEquals(3, sizeof($orphewTags));
-       $this->assertSame('a', $orphewTags[0]['tag']);
-       $this->assertSame('c', $orphewTags[1]['tag']);
-       $this->assertSame('f', $orphewTags[2]['tag']);
-
-       // with limit
-       $orphewTags = $tts->getOrphewTags('>', 1, 2);
-       $this->assertEquals(2, sizeof($orphewTags));
-       $this->assertSame('a', $orphewTags[0]['tag']);
-       $this->assertSame('c', $orphewTags[1]['tag']);
-
-       // with sorting
-       $orphewTags = $tts->getOrphewTags('>', 1, 2, 'nb'); // nb descendants
-       $this->assertEquals(2, sizeof($orphewTags));
-       $this->assertSame('f', $orphewTags[0]['tag']);
-       $this->assertSame('c', $orphewTags[1]['tag']);
-
-       $orphewTags = $tts->getOrphewTags('>', 1, 1, 'depth');
-       $this->assertEquals(1, sizeof($orphewTags));
-       $this->assertSame('c', $orphewTags[0]['tag']);
-
-       $orphewTags = $tts->getOrphewTags('>', 1, null, 'nbupdate');
-       $this->assertEquals(3, sizeof($orphewTags));
-       $this->assertSame('f', $orphewTags[0]['tag']);
-       $this->assertSame('c', $orphewTags[1]['tag']);
-       $this->assertSame('a', $orphewTags[2]['tag']);
-
-    }
-
-   public function testAddLinkedTagsThroughBookmarking()
-    {
-       $bs = $this->bs;
-       $tags = array('a>b', 'b>c', 'a>d>e', 'a>a', 'a', 'r=s', 's=t=u');
-       $bs->addBookmark("http://google.com", "title", "description", "status", $tags, null, false, false, 1);
-       $bookmark = $bs->getBookmarkByAddress("http://google.com");
-
-       $b2ts = $this->b2ts;
-       $savedTags = $b2ts->getTagsForBookmark(intval($bookmark['bId']));
-       $this->assertEquals(6, sizeof($savedTags));
-       $this->assertContains('b', $savedTags);
-       $this->assertContains('c', $savedTags);
-       $this->assertContains('e', $savedTags);
-       $this->assertContains('a', $savedTags);
-       $this->assertContains('r', $savedTags);
-       $this->assertContains('s', $savedTags);
-
-       $tts = $this->tts;
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertEquals(2, sizeof($linkedTags));
-       $this->assertSame('b', $linkedTags[0]['tag']);
-       $this->assertSame('d', $linkedTags[1]['tag']);
-       $linkedTags = $tts->getLinkedTags('b', '>', 1);
-       $this->assertEquals(1, sizeof($linkedTags));
-       $this->assertSame('c', $linkedTags[0]['tag']);
-       $this->assertTrue($tts->existsLinkedTags('d', 'e', '>', 1));
-       $this->assertFalse($tts->existsLinkedTags('e', 'd', '>', 1));
-    }
-
-    public function testSearchThroughLinkedTags()
-    {
-       $tts = $this->tts;
-       $bs = $this->bs;
-
-       $tts->addLinkedTags('aa', 'bb', '>', 1);        
-
-       $tags = array('aa>bb>cc', 'dd');
-       $bs->addBookmark("web1.com", "B1", "description", "status", $tags, null, false, false, 1);
-       $tags = array('bb>gg', 'ee>ff');
-       $bs->addBookmark("web2.com", "B2", "description", "status", $tags, null, false, false, 1);
-       $tags = array('ee=ii');
-       $bs->addBookmark("web3.com", "B3", "description", "status", $tags, null, false, false, 1);
-
-       // Query format:
-       // $bs->getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL);
-
-       // basic queries
-       $results = $bs->getBookmarks(0, NULL, 1, 'dd');
-       $this->assertSame(1, intval($results['total']));
-       $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
-
-       $results = $bs->getBookmarks(0, NULL, 1, 'cc');
-       $this->assertSame(1, intval($results['total']));
-       $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
-
-       //advanced queries
-       $results = $bs->getBookmarks(0, NULL, 1, 'aa');
-       $this->assertSame(2, intval($results['total']));
-       $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
-       $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
-
-       $results = $bs->getBookmarks(0, NULL, 1, 'ee');
-       $this->assertSame(2, intval($results['total']));
-       $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
-       $this->assertSame('B3', $results['bookmarks'][0]['bTitle']);
-
-       $results = $bs->getBookmarks(0, NULL, 1, 'ii');
-       $this->assertSame(2, intval($results['total']));
-       $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
-       $this->assertSame('B3', $results['bookmarks'][0]['bTitle']);
-
-       $results = $bs->getBookmarks(0, NULL, 1, 'aa+ee');
-       $this->assertSame(1, intval($results['total']));
-       $this->assertSame('B2', $results['bookmarks'][0]['bTitle']);
-
-    }
-
-    public function testStatsBetweenTags()
-    {
-       $tsts = $this->tsts;
-       $tts = $this->tts;
-
-       // basic functions
-       $this->assertFalse($tsts->existStat('a', '>', 10));
-       $tsts->setNbDescendants('a', '>', 10, 2);
-       $this->assertSame(2, $tsts->getNbDescendants('a', '>', 10));
-       $tsts->setMaxDepth('a', '>', 10, 3);
-       $this->assertSame(3, $tsts->getMaxDepth('a', '>', 10));
-       $this->assertTrue($tsts->existStat('a', '>', 10));
-       $this->assertFalse($tsts->existStat('a', '>', 20));
-       $tsts->increaseNbUpdate('a', '>', 10);
-       $this->assertSame(1, $tsts->getNbUpdates('a', '>', 10));
-
-       $tsts->deleteAll();
-
-       // no structure
-       $nbC = $tsts->getNbChildren('a', '>', 1);
-       $nbD = $tsts->getNbDescendants('a', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('a', '>', 1);
-       $this->assertSame(0, $nbC);
-       $this->assertSame(0, $nbD);
-       $this->assertSame(0, $maxDepth);
-
-       // simple case
-       $tts->addLinkedTags('b', 'c', '>', 1);
-       $tts->addLinkedTags('a', 'd', '>', 1);
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('b', 'e', '>', 1);
-
-       $this->assertSame(3, $tsts->getNbUpdates('a', '>', '1'));
-       $this->assertSame(2, $tsts->getNbUpdates('b', '>', '1'));
-       $this->assertSame(0, $tsts->getNbUpdates('c', '>', '1'));
-       $this->assertSame(0, $tsts->getNbUpdates('d', '>', '1'));
-       $this->assertSame(0, $tsts->getNbUpdates('e', '>', '1'));
-
-
-       $nbC = $tsts->getNbChildren('a', '>', 1);
-       $nbD = $tsts->getNbDescendants('a', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('a', '>', 1);
-       $this->assertSame(2, $nbC);
-       $this->assertSame(4, $nbD);
-       $this->assertSame(2, $maxDepth);
-
-       $nbC = $tsts->getNbChildren('b', '>', 1);
-       $nbD = $tsts->getNbDescendants('b', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('b', '>', 1);
-       $this->assertSame(2, $nbC);
-       $this->assertSame(2, $nbD);
-       $this->assertSame(1, $maxDepth);        
-
-       $nbC = $tsts->getNbChildren('c', '>', 1);
-       $nbD = $tsts->getNbDescendants('c', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('c', '>', 1);
-       $this->assertSame(0, $nbC);
-       $this->assertSame(0, $nbD);
-       $this->assertSame(0, $maxDepth);
-
-       $nbC = $tsts->getNbChildren('d', '>', 1);
-       $nbD = $tsts->getNbDescendants('d', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('d', '>', 1);
-       $this->assertSame(0, $nbC);
-       $this->assertSame(0, $nbD);
-       $this->assertSame(0, $maxDepth);
-
-       // deletion
-       $tts->removeLinkedTags('b', 'e', '>', 1);
-
-       $nbC = $tsts->getNbChildren('b', '>', 1);
-       $nbD = $tsts->getNbDescendants('b', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('b', '>', 1);
-       $this->assertSame(1, $nbC);
-       $this->assertSame(1, $nbD);
-       $this->assertSame(1, $maxDepth);
-
-       $nbC = $tsts->getNbChildren('a', '>', 1);
-       $nbD = $tsts->getNbDescendants('a', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('a', '>', 1);
-       $this->assertSame(2, $nbC);
-       $this->assertSame(3, $nbD);
-       $this->assertSame(2, $maxDepth);
-
-       //do cases for synonyms
-
-       $tsts->deleteAll();
-       $tts->deleteAll();
-
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('b', 'c', '=', 1);
-       /*$tts->addLinkedTags('a', 'c', '>', 1);
-       $tts->addLinkedTags('j', 'i', '=', 1);
-       $tts->addLinkedTags('f', 'i', '=', 1);
-       $tts->addLinkedTags('d', 'f', '>', 1);
-       $tts->addLinkedTags('d', 'e', '>', 1);
-       $tts->addLinkedTags('j', 'k', '>', 1);*/
-
-       $nbC = $tsts->getNbChildren('a', '>', 1);
-       $nbD = $tsts->getNbDescendants('a', '>', 1);
-       $nbU = $tsts->getNbUpdates('a', '>', 1);
-       $maxDepth = $tsts->getMaxDepth('a', '>', 1);
-       //$this->assertSame(2, $tts->getLinkedTags('a', '>', 1));
-       $this->assertSame(1, $nbC);
-       $this->assertSame(2, $nbD);
-       $this->assertSame(2, $nbU);
-       $this->assertSame(1, $maxDepth);
-
-       // advanced case with fore loop
-       //$tts->addLinkedTags('d', 'c', '>', 1);
-
-       // advanced case with back loop
-       //$tts->addLinkedTags('e', 'a', '>', 1);
-    }
-
-    public function testRenameFunction()
-    {
-       $tts = $this->tts;
-       $b2ts = $this->b2ts;
-       $bs = $this->bs;
-       $tsts = $this->tsts;
-
-       // with classic tags (users 10 & 20)
-       $bs->addBookmark("http://site1.com", "title", "description", "status", array('tag1', 'tag11', 'tag111'), null, false, false, 1);
-       $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('tag2', 'tag22', 'tag222'), null, false, false, 2);
-
-       $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0, $dtend);
-       $this->assertEquals(1, $bookmarks['total']);
-
-       $b2ts->renameTag(1, 'tag1', 'newtag1');
-       $tags1 = $b2ts->getTagsForBookmark(1);
-       $this->assertSame(array('newtag1', 'tag11', 'tag111'), $tags1);
-       $tags1 = $b2ts->getTagsForBookmark(2);
-       $this->assertSame(array('tag2', 'tag22', 'tag222'), $tags1); //should not be changed
-       
-
-       // with linked tags
-
-       $tts->addLinkedTags('b', 'c', '>', 1);
-       $tts->addLinkedTags('a', 'b', '>', 1);
-       $tts->addLinkedTags('b', 'a', '>', 2); // should not be modified because of userid
-
-       $tts->renameTag(1, 'b', 'e');
-       $linkedTags = $tts->getLinkedTags('e', '>', 1);
-       $this->assertSame(array('c'), $linkedTags);
-       $linkedTags = $tts->getLinkedTags('a', '>', 1);
-       $this->assertSame(array('e'), $linkedTags);
-       $linkedTags = $tts->getLinkedTags('b', '>', 2);
-       $this->assertSame(array('a'), $linkedTags);
-
-       //with stats
-
-    }
-
-    // Cannot be test because the function use GLOBALS variables
-    // not taken into account by tests
-    /*public function testMenuTags()
-    {
-       $tts = $this->tts;
-       $bs = $this->bs;
-
-       $bs->addBookmark("http://site1.com", "title", "description", "status", array('menu>tag1'), null, false, false, 1);
-       $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('menu>tag2>tag3'), null, false, false, 1);
-       $bs->addBookmark("http://site1.com", "title3", "description3", "status", array('menu>tag1', 'menu>tag4'), null, false, false, 2);
-
-       $menuTags = $tts->getMenuTags($uId);
-       $this->assertEquals(3, sizeof($menuTags));
-       $this->assertContains('tag1', $menuTags);
-       $this->assertContains('tag2', $menuTags);
-       $this->assertContains('tag4', $menuTags);
-
-    }*/
+       protected $us;
+       protected $bs;
+       protected $b2ts;
+       protected $tts;
+
+       protected function setUp()
+       {
+               global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix;
+               require_once('./header.inc.php');
+
+               $this->us =& ServiceFactory::getServiceInstance('UserService');
+               $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
+               $this->bs->deleteAll();
+               $this->b2ts =& ServiceFactory::getServiceInstance('Bookmark2TagService');
+               $this->b2ts->deleteAll();
+               $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
+               $this->tts->deleteAll();
+               $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
+               $this->tsts->deleteAll();
+       }
+
+       public function testManipulateTag2TagRelationsOfInclusion()
+       {
+               $tts = $this->tts;
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('a', 'c', '>', 1);
+               $tts->addLinkedTags('a', 'd', '>', 20);
+               $tts->addLinkedTags('b', 'd', '>', 1);
+               $tts->addLinkedTags('d', 'e', '>', 1);
+               $tts->addLinkedTags('d', 'e', '>', 20);
+               $tts->addLinkedTags('f', 'g', '>', 20);
+
+               // basic test
+
+
+               $links = $tts->getLinks(1);
+               $this->assertEquals(4, count($links));
+
+               $allLinkedTags = $tts->getAllLinkedTags('e', '>', 1);
+               $this->assertEquals(array(), $allLinkedTags);
+
+               $allLinkedTags = $tts->getAllLinkedTags('d', '>', 1);
+               $this->assertEquals(array('e'), $allLinkedTags);
+
+               $allLinkedTags = $tts->getAllLinkedTags('b', '>', 1);
+               $this->assertEquals(array('d', 'e'), $allLinkedTags);
+               $this->assertEquals(2, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+
+               $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1);
+               $this->assertEquals(4, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('b', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+
+
+               // warning: we add recursive link
+               $tts->addLinkedTags('b', 'a', '>', 1);
+
+               $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1);
+               $this->assertEquals(4, sizeof($allLinkedTags));
+               //$this->assertTrue(in_array('a', $allLinkedTags));
+               $this->assertTrue(in_array('b', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+
+               $orphewTags = $tts->getOrphewTags('>', 1);
+               $this->assertEquals(0, sizeof($orphewTags));
+               $orphewTags = $tts->getOrphewTags('>', 20);
+               $this->assertEquals(2, sizeof($orphewTags));
+               $this->assertSame('a', $orphewTags[0]['tag']);
+               $this->assertSame('f', $orphewTags[1]['tag']);
+               $orphewTags = $tts->getOrphewTags('>');
+               $this->assertEquals(1, sizeof($orphewTags));
+               $this->assertSame('f', $orphewTags[0]['tag']);
+
+               $linkedTags = $tts->getLinkedTags('a', '>');
+               $this->assertSame(array('b', 'c', 'd'), $linkedTags);
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertSame(array('b', 'c'), $linkedTags);
+               $tts->removeLinkedTags('a', 'b', '>', 1);
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertSame(array('c'), $linkedTags);
+               $tts->removeLinkedTags('a', 'c', '>', 1);
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertEquals(0, sizeof($linkedTags));
+       }
+
+       public function testManipulateTag2TagRelationsOfSynonym()
+       {
+               $tts = $this->tts;
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('b', 'd', '=', 1);
+               $tts->addLinkedTags('d', 'e', '=', 1);
+               $tts->addLinkedTags('d', 'f', '=', 1);
+               $tts->addLinkedTags('e', 'g', '>', 1);
+
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertSame(array('b'), $linkedTags);
+
+               $linkedTags = $tts->getLinkedTags('a', '=', 1);
+               $this->assertSame(array(), $linkedTags);
+
+               $linkedTags = $tts->getLinkedTags('b', '=', 1);
+               $this->assertSame(array('d'), $linkedTags);
+
+               $linkedTags = $tts->getLinkedTags('d', '=', 1);
+               $this->assertEquals(3, sizeof($linkedTags));
+               $this->assertTrue(in_array('b', $linkedTags)); // '=' is bijective
+               $this->assertTrue(in_array('e', $linkedTags));
+               $this->assertTrue(in_array('f', $linkedTags));
+
+               $linkedTags = $tts->getLinkedTags('f', '=', 1);
+               $this->assertEquals(1, sizeof($linkedTags));
+               $this->assertTrue(in_array('d', $linkedTags)); // '=' is bijective
+
+               // test allLinkTags (with inference)
+               $allLinkedTags = $tts->getAllLinkedTags('a', '=', 1);
+               $this->assertEquals(0, sizeof($allLinkedTags));
+
+               $allLinkedTags = $tts->getAllLinkedTags('b', '=', 1);
+               $this->assertEquals(3, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+               $this->assertTrue(in_array('f', $allLinkedTags));
+
+               $allLinkedTags = $tts->getAllLinkedTags('f', '>', 1);
+               $this->assertEquals(5, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('b', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('g', $allLinkedTags));
+
+               $allLinkedTags = $tts->getAllLinkedTags('a', '>', 1);
+               $this->assertEquals(6, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('b', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+               $this->assertTrue(in_array('f', $allLinkedTags));
+               $this->assertTrue(in_array('g', $allLinkedTags));
+
+               $tts->addLinkedTags('g', 'h', '>', 1);
+               $tts->addLinkedTags('i', 'h', '=', 1);
+               $tts->addLinkedTags('j', 'f', '>', 1);
+
+               $allLinkedTags = $tts->getAllLinkedTags('j', '>', 1);
+               $this->assertEquals(8, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('b', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+               $this->assertTrue(in_array('f', $allLinkedTags));
+               $this->assertTrue(in_array('g', $allLinkedTags));
+               $this->assertTrue(in_array('h', $allLinkedTags));
+               $this->assertTrue(in_array('i', $allLinkedTags));
+
+               // complex case: test cycle
+               $tts->addLinkedTags('g', 'a', '>', 1);
+               $allLinkedTags = $tts->getAllLinkedTags('b', '>', 1);
+               $this->assertEquals(8, sizeof($allLinkedTags));
+               $this->assertTrue(in_array('a', $allLinkedTags));
+               $this->assertTrue(in_array('c', $allLinkedTags));
+               $this->assertTrue(in_array('d', $allLinkedTags));
+               $this->assertTrue(in_array('e', $allLinkedTags));
+               $this->assertTrue(in_array('f', $allLinkedTags));
+               $this->assertTrue(in_array('g', $allLinkedTags));
+               $this->assertTrue(in_array('h', $allLinkedTags));
+               $this->assertTrue(in_array('i', $allLinkedTags));
+
+       }
+
+       // Test function that select the best tags to display?
+       public function testViewTag2TagRelations()
+       {
+               $tts = $this->tts;
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('c', 'd', '>', 1);
+               $tts->addLinkedTags('d', 'e', '>', 1);
+               $tts->addLinkedTags('f', 'g', '>', 1);
+               $tts->addLinkedTags('f', 'h', '>', 1);
+               $tts->addLinkedTags('f', 'i', '>', 1);
+
+               $orphewTags = $tts->getOrphewTags('>', 1);
+               $this->assertEquals(3, sizeof($orphewTags));
+               $this->assertSame('a', $orphewTags[0]['tag']);
+               $this->assertSame('c', $orphewTags[1]['tag']);
+               $this->assertSame('f', $orphewTags[2]['tag']);
+
+               // with limit
+               $orphewTags = $tts->getOrphewTags('>', 1, 2);
+               $this->assertEquals(2, sizeof($orphewTags));
+               $this->assertSame('a', $orphewTags[0]['tag']);
+               $this->assertSame('c', $orphewTags[1]['tag']);
+
+               // with sorting
+               $orphewTags = $tts->getOrphewTags('>', 1, 2, 'nb'); // nb descendants
+               $this->assertEquals(2, sizeof($orphewTags));
+               $this->assertSame('f', $orphewTags[0]['tag']);
+               $this->assertSame('c', $orphewTags[1]['tag']);
+
+               $orphewTags = $tts->getOrphewTags('>', 1, 1, 'depth');
+               $this->assertEquals(1, sizeof($orphewTags));
+               $this->assertSame('c', $orphewTags[0]['tag']);
+
+               $orphewTags = $tts->getOrphewTags('>', 1, null, 'nbupdate');
+               $this->assertEquals(3, sizeof($orphewTags));
+               $this->assertSame('f', $orphewTags[0]['tag']);
+               $this->assertSame('c', $orphewTags[1]['tag']);
+               $this->assertSame('a', $orphewTags[2]['tag']);
+
+       }
+
+       public function testAddLinkedTagsThroughBookmarking()
+       {
+               $bs = $this->bs;
+               $tags = array('a>b', 'b>c', 'a>d>e', 'a>a', 'a', 'r=s', 's=t=u');
+               $bs->addBookmark("http://google.com", "title", "description", "status", $tags, null, false, false, 1);
+               $bookmark = $bs->getBookmarkByAddress("http://google.com");
+
+               $b2ts = $this->b2ts;
+               $savedTags = $b2ts->getTagsForBookmark(intval($bookmark['bId']));
+               $this->assertEquals(6, sizeof($savedTags));
+               $this->assertContains('b', $savedTags);
+               $this->assertContains('c', $savedTags);
+               $this->assertContains('e', $savedTags);
+               $this->assertContains('a', $savedTags);
+               $this->assertContains('r', $savedTags);
+               $this->assertContains('s', $savedTags);
+
+               $tts = $this->tts;
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertEquals(2, sizeof($linkedTags));
+               $this->assertSame('b', $linkedTags[0]['tag']);
+               $this->assertSame('d', $linkedTags[1]['tag']);
+               $linkedTags = $tts->getLinkedTags('b', '>', 1);
+               $this->assertEquals(1, sizeof($linkedTags));
+               $this->assertSame('c', $linkedTags[0]['tag']);
+               $this->assertTrue($tts->existsLinkedTags('d', 'e', '>', 1));
+               $this->assertFalse($tts->existsLinkedTags('e', 'd', '>', 1));
+       }
+
+       public function testSearchThroughLinkedTags()
+       {
+               $tts = $this->tts;
+               $bs = $this->bs;
+
+               $tts->addLinkedTags('aa', 'bb', '>', 1);
+
+               $tags = array('aa>bb>cc', 'dd');
+               $bs->addBookmark("web1.com", "B1", "description", "status", $tags, null, false, false, 1);
+               $tags = array('bb>gg', 'ee>ff');
+               $bs->addBookmark("web2.com", "B2", "description", "status", $tags, null, false, false, 1);
+               $tags = array('ee=ii');
+               $bs->addBookmark("web3.com", "B3", "description", "status", $tags, null, false, false, 1);
+
+               // Query format:
+               // $bs->getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL);
+
+               // basic queries
+               $results = $bs->getBookmarks(0, NULL, 1, 'dd');
+               $this->assertSame(1, intval($results['total']));
+               $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
+
+               $results = $bs->getBookmarks(0, NULL, 1, 'cc');
+               $this->assertSame(1, intval($results['total']));
+               $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
+
+               //advanced queries
+               $results = $bs->getBookmarks(0, NULL, 1, 'aa');
+               $this->assertSame(2, intval($results['total']));
+               $this->assertSame('B1', $results['bookmarks'][0]['bTitle']);
+               $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
+
+               $results = $bs->getBookmarks(0, NULL, 1, 'ee');
+               $this->assertSame(2, intval($results['total']));
+               $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
+               $this->assertSame('B3', $results['bookmarks'][0]['bTitle']);
+
+               $results = $bs->getBookmarks(0, NULL, 1, 'ii');
+               $this->assertSame(2, intval($results['total']));
+               $this->assertSame('B2', $results['bookmarks'][1]['bTitle']);
+               $this->assertSame('B3', $results['bookmarks'][0]['bTitle']);
+
+               $results = $bs->getBookmarks(0, NULL, 1, 'aa+ee');
+               $this->assertSame(1, intval($results['total']));
+               $this->assertSame('B2', $results['bookmarks'][0]['bTitle']);
+
+       }
+
+       public function testStatsBetweenTags()
+       {
+               $tsts = $this->tsts;
+               $tts = $this->tts;
+
+               // basic functions
+               $this->assertFalse($tsts->existStat('a', '>', 10));
+               $tsts->setNbDescendants('a', '>', 10, 2);
+               $this->assertSame(2, $tsts->getNbDescendants('a', '>', 10));
+               $tsts->setMaxDepth('a', '>', 10, 3);
+               $this->assertSame(3, $tsts->getMaxDepth('a', '>', 10));
+               $this->assertTrue($tsts->existStat('a', '>', 10));
+               $this->assertFalse($tsts->existStat('a', '>', 20));
+               $tsts->increaseNbUpdate('a', '>', 10);
+               $this->assertSame(1, $tsts->getNbUpdates('a', '>', 10));
+
+               $tsts->deleteAll();
+
+               // no structure
+               $nbC = $tsts->getNbChildren('a', '>', 1);
+               $nbD = $tsts->getNbDescendants('a', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('a', '>', 1);
+               $this->assertSame(0, $nbC);
+               $this->assertSame(0, $nbD);
+               $this->assertSame(0, $maxDepth);
+
+               // simple case
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('a', 'd', '>', 1);
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'e', '>', 1);
+
+               $this->assertSame(3, $tsts->getNbUpdates('a', '>', '1'));
+               $this->assertSame(2, $tsts->getNbUpdates('b', '>', '1'));
+               $this->assertSame(0, $tsts->getNbUpdates('c', '>', '1'));
+               $this->assertSame(0, $tsts->getNbUpdates('d', '>', '1'));
+               $this->assertSame(0, $tsts->getNbUpdates('e', '>', '1'));
+
+
+               $nbC = $tsts->getNbChildren('a', '>', 1);
+               $nbD = $tsts->getNbDescendants('a', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('a', '>', 1);
+               $this->assertSame(2, $nbC);
+               $this->assertSame(4, $nbD);
+               $this->assertSame(2, $maxDepth);
+
+               $nbC = $tsts->getNbChildren('b', '>', 1);
+               $nbD = $tsts->getNbDescendants('b', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('b', '>', 1);
+               $this->assertSame(2, $nbC);
+               $this->assertSame(2, $nbD);
+               $this->assertSame(1, $maxDepth);
+
+               $nbC = $tsts->getNbChildren('c', '>', 1);
+               $nbD = $tsts->getNbDescendants('c', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('c', '>', 1);
+               $this->assertSame(0, $nbC);
+               $this->assertSame(0, $nbD);
+               $this->assertSame(0, $maxDepth);
+
+               $nbC = $tsts->getNbChildren('d', '>', 1);
+               $nbD = $tsts->getNbDescendants('d', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('d', '>', 1);
+               $this->assertSame(0, $nbC);
+               $this->assertSame(0, $nbD);
+               $this->assertSame(0, $maxDepth);
+
+               // deletion
+               $tts->removeLinkedTags('b', 'e', '>', 1);
+
+               $nbC = $tsts->getNbChildren('b', '>', 1);
+               $nbD = $tsts->getNbDescendants('b', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('b', '>', 1);
+               $this->assertSame(1, $nbC);
+               $this->assertSame(1, $nbD);
+               $this->assertSame(1, $maxDepth);
+
+               $nbC = $tsts->getNbChildren('a', '>', 1);
+               $nbD = $tsts->getNbDescendants('a', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('a', '>', 1);
+               $this->assertSame(2, $nbC);
+               $this->assertSame(3, $nbD);
+               $this->assertSame(2, $maxDepth);
+
+               //do cases for synonyms
+               
+               $this->markTestSkipped('Check stats');
+
+               $tsts->deleteAll();
+               $tts->deleteAll();
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'c', '=', 1);
+               /*$tts->addLinkedTags('a', 'c', '>', 1);
+                $tts->addLinkedTags('j', 'i', '=', 1);
+                $tts->addLinkedTags('f', 'i', '=', 1);
+                $tts->addLinkedTags('d', 'f', '>', 1);
+                $tts->addLinkedTags('d', 'e', '>', 1);
+                $tts->addLinkedTags('j', 'k', '>', 1);*/
+
+               $nbC = $tsts->getNbChildren('a', '>', 1);
+               $nbD = $tsts->getNbDescendants('a', '>', 1);
+               $nbU = $tsts->getNbUpdates('a', '>', 1);
+               $maxDepth = $tsts->getMaxDepth('a', '>', 1);
+               //$this->assertSame(2, $tts->getLinkedTags('a', '>', 1));
+               $this->assertSame(1, $nbC);
+               //$this->assertSame(2, $nbD);
+               $this->assertSame(2, $nbU);
+               $this->assertSame(1, $maxDepth);
+
+               // advanced case with fore loop
+               //$tts->addLinkedTags('d', 'c', '>', 1);
+
+               // advanced case with back loop
+               //$tts->addLinkedTags('e', 'a', '>', 1);
+       }
+
+       public function testRenameFunction()
+       {
+               $tts = $this->tts;
+               $b2ts = $this->b2ts;
+               $bs = $this->bs;
+               $tsts = $this->tsts;
+
+               // with classic tags (users 10 & 20)
+               $bs->addBookmark("http://site1.com", "title", "description", "status", array('tag1', 'tag11', 'tag111'), null, false, false, 1);
+               $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('tag2', 'tag22', 'tag222'), null, false, false, 2);
+
+               $bookmarks =& $bs->getBookmarks(0, 1, NULL, NULL, NULL, getSortOrder(), NULL, 0, $dtend);
+               $this->assertEquals(1, $bookmarks['total']);
+
+               $b2ts->renameTag(1, 'tag1', 'newtag1');
+               $tags1 = $b2ts->getTagsForBookmark(1);
+               $this->assertSame(array('newtag1', 'tag11', 'tag111'), $tags1);
+               $tags1 = $b2ts->getTagsForBookmark(2);
+               $this->assertSame(array('tag2', 'tag22', 'tag222'), $tags1); //should not be changed
+
+
+               // with linked tags
+
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'a', '>', 2); // should not be modified because of userid
+
+               $tts->renameTag(1, 'b', 'e');
+               $linkedTags = $tts->getLinkedTags('e', '>', 1);
+               $this->assertSame(array('c'), $linkedTags);
+               $linkedTags = $tts->getLinkedTags('a', '>', 1);
+               $this->assertSame(array('e'), $linkedTags);
+               $linkedTags = $tts->getLinkedTags('b', '>', 2);
+               $this->assertSame(array('a'), $linkedTags);
+
+               //with stats
+
+       }
+
+       // Cannot be test because the function use GLOBALS variables
+       // not taken into account by tests
+       /*public function testMenuTags()
+        {
+        $tts = $this->tts;
+        $bs = $this->bs;
+
+        $bs->addBookmark("http://site1.com", "title", "description", "status", array('menu>tag1'), null, false, false, 1);
+        $bs->addBookmark("http://site1.com", "title2", "description2", "status", array('menu>tag2>tag3'), null, false, false, 1);
+        $bs->addBookmark("http://site1.com", "title3", "description3", "status", array('menu>tag1', 'menu>tag4'), null, false, false, 2);
+
+        $menuTags = $tts->getMenuTags($uId);
+        $this->assertEquals(3, sizeof($menuTags));
+        $this->assertContains('tag1', $menuTags);
+        $this->assertContains('tag2', $menuTags);
+        $this->assertContains('tag4', $menuTags);
+
+        }*/
 }
 ?>
diff --git a/tests/tagsCacheTest.php b/tests/tagsCacheTest.php
new file mode 100644 (file)
index 0000000..f08de05
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+require_once 'PHPUnit/Framework.php';
+
+/*
+ To launch this test, type the following line into a shell
+ at the root of the scuttlePlus directory :
+ phpunit TagsCacheTest tests/tagsCacheTest.php
+ */
+
+class TagsCacheTest extends PHPUnit_Framework_TestCase
+{
+       protected $us;
+       protected $bs;
+       protected $b2ts;
+       protected $tts;
+
+       protected function setUp()
+       {
+               global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix, $TEMPLATES_DIR, $debugMode;
+               require_once('./header.inc.php');
+
+               $this->us =& ServiceFactory::getServiceInstance('UserService');
+               $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
+               $this->bs->deleteAll();
+               $this->b2ts =& ServiceFactory::getServiceInstance('Bookmark2TagService');
+               $this->b2ts->deleteAll();
+               $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
+               $this->tts->deleteAll();
+               $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
+               $this->tsts->deleteAll();
+               $this->tcs =& ServiceFactory::getServiceInstance('TagCacheService');
+               $this->tcs->deleteAll();
+       }
+
+       public function testInclusionAllowsToAddAndDeleteChildrenTags() {
+               //message_die(GENERAL_ERROR, $GLOBALS['dbname'].'1');
+
+               $tts = $this->tts;
+               $tcs = $this->tcs;
+
+               // test adding children
+               $tcs->addChild('a', 'b', 1);
+               $tcs->addChild('a', 'c', 1);
+               $this->assertEquals(array('b','c'), $tcs->getChildren('a', 1));
+
+               // test adding a same child
+               $tcs->addChild('a', 'b', 1);
+               $this->assertEquals(array('b','c'), $tcs->getChildren('a', 1));
+
+               // test removing a child
+               $tcs->removeChild('a', 'b', 1);
+               $this->assertEquals(array('c'), $tcs->getChildren('a', 1));
+
+               // test removing a same child
+               $tcs->removeChild('a', 'b', 1);
+               $this->assertEquals(array('c'), $tcs->getChildren('a', 1));
+
+               // test existing child
+               $this->assertTrue($tcs->existsChild('a', 'c', 1));
+               $this->assertTrue(!$tcs->existsChild('a', 'c', 2)); // wrong user
+               $this->assertTrue(!$tcs->existsChild('a', 'b', 1)); // wrong child
+
+               // test removing several children
+               $tcs->addChild('e', 'f', 1);
+               $tcs->addChild('e', 'g', 1);
+               $tcs->addChild('e', 'h', 1);
+               $tcs->removeChild('e', NULL, 1);
+
+               $this->assertTrue(!$tcs->existsChild('e', 'f', 1));
+               $this->assertTrue(!$tcs->existsChild('e', 'g', 1));
+               $this->assertTrue(!$tcs->existsChild('e', 'h', 1));
+
+       }
+
+       public function testInclusionCacheIsUpdatedWhenATag2TagLinkIsCreatedOrRemoved() {
+               $tts = $this->tts;
+               $tcs = $this->tcs;
+
+               // test inclusion without possible errors
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('c', 'd', '>', 1);
+               $tts->addLinkedTags('e', 'f', '>', 1);
+               $tts->addLinkedTags('b', 'e', '>', 1);
+
+               $this->assertSame(array('b','c','d','e','f'), $tts->getAllLinkedTags('a', '>', 1));
+               $this->assertSame(array('c','d','e','f'), $tts->getAllLinkedTags('b', '>', 1));
+
+               // test inclusion with deletion
+               $tts->removeLinkedTags('b', 'c', '>', 1);
+               $this->assertSame(array('b','e','f'), $tts->getAllLinkedTags('a', '>', 1));
+               $this->assertSame(array('e','f'), $tts->getAllLinkedTags('b', '>', 1));
+               $this->assertSame(array('d'), $tts->getAllLinkedTags('c', '>', 1));
+               $this->assertSame(array('f'), $tts->getAllLinkedTags('e', '>', 1));
+
+       }
+
+       public function testInclusionResistsToTagCycles() {
+               $tts = $this->tts;
+               $tcs = $this->tcs;
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('c', 'a', '>', 1); // creates cycle a>c>a
+               
+               $this->assertSame(array('b','c'), $tts->getAllLinkedTags('a', '>', 1));
+               $this->assertSame(array('c', 'a'), $tts->getAllLinkedTags('b', '>', 1));
+               $this->assertSame(array('a', 'b'), $tts->getAllLinkedTags('c', '>', 1));
+       }
+
+       public function testSynonymyAllowsToAddAndDeleteSynonyms() {
+               $tts = $this->tts;
+               $tcs = $this->tcs;
+
+               // simple synonymy
+               $tcs->addSynonym('a', 'b', 1);
+               $tcs->addSynonym('a', 'c', 1);
+
+               $this->assertEquals(array('b', 'c'), $tcs->getSynonyms('a', 1));
+               $this->assertEquals(array('c', 'a'), $tcs->getSynonyms('b', 1));
+               $this->assertEquals(array('b', 'a'), $tcs->getSynonyms('c', 1));
+
+               //more advanced one 1
+               $tcs->deleteByUser(1);
+               $tcs->addSynonym('a', 'b', 1);
+               $tcs->addSynonym('a', 'c', 1);
+               $tcs->addSynonym('d', 'e', 1);
+               $tcs->addSynonym('a', 'e', 1);
+               $this->assertEquals(array('b', 'c', 'e', 'd'), $tcs->getSynonyms('a', 1));
+
+               //more advanced one 2
+               $tcs->deleteByUser(1);
+               $tcs->addSynonym('a', 'b', 1);
+               $tcs->addSynonym('a', 'c', 1);
+               $tcs->addSynonym('d', 'e', 1);
+               $tcs->addSynonym('a', 'd', 1);
+               $this->assertEquals(array('b', 'c', 'd', 'e'), $tcs->getSynonyms('a', 1));
+
+               //with Linked tags
+               $tcs->deleteByUser(1);
+               $tts->addLinkedTags('a', 'b', '=', 1);
+               $tts->addLinkedTags('c', 'd', '=', 1);
+               $tts->addLinkedTags('c', 'e', '=', 1);
+               $tts->addLinkedTags('e', 'a', '=', 1);
+               $this->assertEquals(array('b', 'e', 'c', 'd'), $tts->getAllLinkedTags('a', '=', 1));
+
+       }
+
+       public function testInclusionTakesSynonymsIntoAccount() {
+               $tts = $this->tts;
+               $tcs = $this->tcs;
+
+               $tts->addLinkedTags('a', 'b', '>', 1);
+               $tts->addLinkedTags('b', 'c', '>', 1);
+               $tts->addLinkedTags('d', 'e', '>', 1);
+               $tts->addLinkedTags('c', 'd', '=', 1);
+               
+               // results are put into cache
+               $this->assertEquals(array('b', 'c', 'd', 'e'), $tts->getAllLinkedTags('a', '>', 1));
+               $this->assertEquals(array('d', 'e'), $tts->getAllLinkedTags('c', '>', 1));
+
+               // same results must be taken out from cache            
+               $this->assertEquals(array('b', 'c', 'd', 'e'), $tts->getAllLinkedTags('a', '>', 1));
+               $this->assertEquals(array('d', 'e'), $tts->getAllLinkedTags('c', '>', 1));
+               
+               //cache must be deleted for user when links are modified
+               $tts->addLinkedTags('a', 'f', '=', 1);
+               $this->assertEquals(array(), $tcs->getChildren('a', 1));
+               $this->assertEquals(array(), $tcs->getSynonyms('d', 1));
+       }
+}
+?>
index d2ed5690a95ba01574eedc45f7f284ea19a69d61..49fec6f463d4ad041aa8b1319585aa26f5a25b49 100644 (file)
@@ -2,75 +2,75 @@
 require_once 'PHPUnit/Framework.php';
 
 /*
-To launch this test, type the following line into a shell
-at the root of the scuttlePlus directory :
    phpunit TagsTest tests/tagsTest.php
-*/
+ To launch this test, type the following line into a shell
+ at the root of the scuttlePlus directory :
+ phpunit TagsTest tests/tagsTest.php
+ */
 
 class TagsTest extends PHPUnit_Framework_TestCase
 {
-    protected $ts;
-    protected function setUp()
-    {
-        global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix;
-       require_once('./header.inc.php');
-
-       $this->ts =& ServiceFactory::getServiceInstance('TagService');
-       $this->ts->deleteAll();
-       $this->us =& ServiceFactory::getServiceInstance('UserService');
-       $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
-       $this->bs->deleteAll();
-       $this->b2ts =& ServiceFactory::getServiceInstance('Bookmark2TagService');
-       $this->b2ts->deleteAll();
-       $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
-       $this->tts->deleteAll(); 
-       $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
-       $this->tsts->deleteAll();
-    }
-    public function testTagDescriptions()
-    {
-       $ts = $this->ts;
-
-       $desc = $ts->getAllDescriptions('tag1');
-       $this->assertSame(array(), $desc);
-
-       $desc = $ts->getDescription('tag1', 1); // user 1
-       $this->assertSame(array(), $desc);      
-
-       $desc1 = "test description";
-       $ts->updateDescription('tag1', 1, $desc1);  // first desc
-       $desc = $ts->getDescription('tag1', 1);
-       $this->assertEquals(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), $desc);
-
-       $desc1 = "&é\"'(-è_çà)=´~#'#{{[\\\\[||`\^\^@^@}¹²¡×¿ ?./§µ%";
-       $ts->updateDescription('tag1', 1, $desc1); // update desc
-       $desc = $ts->getDescription('tag1', 1);
-       $this->assertEquals(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), $desc);
-
-       $desc2 = "æâ€êþÿûîîôôöŀï'üð’‘ßä«≤»©»  ↓¿×÷¡¹²³";
-       $ts->updateDescription('tag1', 2, $desc2); // user 2
-       $desc = $ts->getDescription('tag1', 2);
-       $this->assertEquals(array('tag'=>'tag1', 'uId'=>2, 'tDescription'=>$desc2), $desc);
-
-       $desc = $ts->getAllDescriptions('tag1');
-       $this->assertEquals($desc, array(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), array('tag'=>'tag1', 'uId'=>2, 'tDescription'=>$desc2)));
-
-    }
-
-    public function testRenameFunction()
-    {
-       $ts = $this->ts;
-
-       $ts->updateDescription('tag1', 10, 'xxx');
-       $ts->renameTag(10, 'tag1', 'tag2');
-       $desc = $ts->getDescription('tag1', 10);
-       $this->assertSame(array(), $desc);
-       $desc = $ts->getDescription('tag2', 10);
-       $this->assertEquals(array('tag'=>'tag2', 'uId'=>10, 'tDescription'=>'xxx'), $desc);     
-       
-    }
+       protected $ts;
+
+       protected function setUp()
+       {
+               global $dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbpersist, $dbtype, $tableprefix;
+               require_once('./header.inc.php');
+
+               $this->ts =& ServiceFactory::getServiceInstance('TagService');
+               $this->ts->deleteAll();
+               $this->us =& ServiceFactory::getServiceInstance('UserService');
+               $this->bs =& ServiceFactory::getServiceInstance('BookmarkService');
+               $this->bs->deleteAll();
+               $this->b2ts =& ServiceFactory::getServiceInstance('Bookmark2TagService');
+               $this->b2ts->deleteAll();
+               $this->tts =& ServiceFactory::getServiceInstance('Tag2TagService');
+               $this->tts->deleteAll();
+               $this->tsts =& ServiceFactory::getServiceInstance('TagStatService');
+               $this->tsts->deleteAll();
+       }
+
+       public function testTagDescriptions()
+       {
+               $ts = $this->ts;
+
+               $desc = $ts->getAllDescriptions('tag1');
+               $this->assertSame(array(), $desc);
+
+               $desc = $ts->getDescription('tag1', 1); // user 1
+               $this->assertSame(array('tDescription'=>''), $desc);
+
+               $desc1 = "test description";
+               $ts->updateDescription('tag1', 1, $desc1);  // first desc
+               $desc = $ts->getDescription('tag1', 1);
+               $this->assertEquals(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), $desc);
+
+               $desc1 = "&é\"'(-è_çà)=´~#'#{{[\\\\[||`\^\^@^@}¹²¡×¿ ?./§µ%";
+               $ts->updateDescription('tag1', 1, $desc1); // update desc
+               $desc = $ts->getDescription('tag1', 1);
+               $this->assertEquals(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), $desc);
+
+               $desc2 = "æâ€êþÿûîîôôöŀï'üð’‘ßä«≤»©»  ↓¿×÷¡¹²³";
+               $ts->updateDescription('tag1', 2, $desc2); // user 2
+               $desc = $ts->getDescription('tag1', 2);
+               $this->assertEquals(array('tag'=>'tag1', 'uId'=>2, 'tDescription'=>$desc2), $desc);
+
+               $desc = $ts->getAllDescriptions('tag1');
+               $this->assertEquals($desc, array(array('tag'=>'tag1', 'uId'=>1, 'tDescription'=>$desc1), array('tag'=>'tag1', 'uId'=>2, 'tDescription'=>$desc2)));
+
+       }
+
+       public function testRenameFunction()
+       {
+               $ts = $this->ts;
+
+               $ts->updateDescription('tag1', 10, 'xxx');
+               $ts->renameTag(10, 'tag1', 'tag2');
+               $desc = $ts->getDescription('tag1', 10);
+               $this->assertSame(array('tDescription'=>''), $desc);
+               $desc = $ts->getDescription('tag2', 10);
+               $this->assertEquals(array('tag'=>'tag2', 'uId'=>10, 'tDescription'=>'xxx'), $desc);
+
+       }
 
 }
 ?>