<?php 
/*******************************************************************************
 * Copyright (c) 2010 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
$App = new App();

require_once '../classes/ProjectRoot.class.php';
require_once '../classes/TestRunner.class.php';

class ProjectTests extends TestCase {
	function testProjectNameIsValid() {
		$this->assertTrue(ProjectRoot::isValidProjectName("eclipse"));
		$this->assertTrue(ProjectRoot::isValidProjectName("eclipse.technology"));
		$this->assertTrue(ProjectRoot::isValidProjectName("eclipse.technology.foo"));
		$this->assertTrue(ProjectRoot::isValidProjectName("eclipse.technology.g-foo"));
		
		$this->assertFalse(ProjectRoot::isValidProjectName(""));
		$this->assertFalse(ProjectRoot::isValidProjectName("eclipse.technology.foo.stuff"));
	}
	
//	function testNormalizeDescriptionUrl() {
//		$this->assertNull(Project::normalizeProjectDescriptionUrl(""));
//		$this->assertNull(Project::normalizeProjectDescriptionUrl("http://other.site/description.html"));
//		$this->assertNull(Project::normalizeProjectDescriptionUrl("http://.eclipse.org/technology/description.html"));
//				
//		$this->assertEquals("http://www.eclipse.org/technology/description.html", Project::normalizeProjectDescriptionUrl("http://www.eclipse.org/technology/description.html"));
//		$this->assertEquals("http://eclipse.org/technology/description.html", Project::normalizeProjectDescriptionUrl("http://eclipse.org/technology/description.html"));
//		$this->assertEquals("http://www.eclipse.org/technology/description.html", Project::normalizeProjectDescriptionUrl("/technology/description.html"));
//		$this->assertEquals("http://www.eclipse.org/technology/description.html", Project::normalizeProjectDescriptionUrl("technology/description.html"));
//	}
	
	function testExtractShortDescription() {
		$this->assertEquals("Description1", Project::extractShortDescription("<p>Description1</p>"));
		$this->assertEquals("Description2", Project::extractShortDescription("<div><p>Description2</p>\n<p>Junk</p></div>"));
		$this->assertEquals("Description3\nline2", Project::extractShortDescription("<p>Description3\nline2</p>"));
		$this->assertEquals("Description4", Project::extractShortDescription("<h1>Ignore</h1><p>Description4</p><p>line2</p>"));
		
		$this->assertEquals("x <b>q</b> z", Project::extractShortDescription("<h1>Ignore</h1><p>x <b>q</b> z</p><p>line2</p>"));
		$this->assertEquals("x q", Project::extractShortDescription("<h1>Ignore</h1><p>x q<br> c</p><p>line2</p>"));
		$this->assertEquals("x q", Project::extractShortDescription("<h1>Ignore</h1><p>x q<br/> c</p><p>line2</p>"));
		$this->assertEquals("x q", Project::extractShortDescription("<h1>Ignore</h1><p>x q<br /> c</p><p>line2</p>"));
		$this->assertEquals("x q", Project::extractShortDescription("<p><div>x q</div></p>"));
		$this->assertEquals("x q", Project::extractShortDescription("<p><div style=\"blah\">x q</div></p>"));
	}
	
	function testExtractShortDescription2() {
		$this->assertEquals("Two words ...", Project::extractShortDescription("<p>Two words are better than one.</p>", 2));
	}
	
	function testSingleProjectInitialLoad() {
		global $App;
		if (!$App->devmode) return $this->fail("This test can only be run in development mode.");
		
		$root = new ProjectRoot();
		$project = $root->get_project("technology.dash");
		
		$this->assertEquals("technology.dash", $project->getId());
		$this->assertFalse($project->root->isProjectInfoLoaded);
	}
	
	function testSingleProjectLoadProjectInfo() {
		global $App;
		if (!$App->devmode) return $this->fail("This test can only be run in development mode.");
		
		$root = new ProjectRoot();

		$project = $root->get_project("technology.foo");

		$this->assertEquals("http://www.eclipse.org/foo/downloads.php", $project->getDownloadsUrl());
		$this->assertTrue($root->isProjectInfoLoaded);
	}
	
	/*
	 * When the same ProjectRoot is used to get the same project, it should
	 * answer the same object (i.e. object identity is preserved).
	 */
	function testMultipleGetIdentity() {
		global $App;
		if (!$App->devmode) return $this->fail("This test can only be run in development mode.");
		
		$root = new ProjectRoot();

		$project1 = $root->get_project("technology.foo");
		$project2 = $root->get_project("technology.foo");

		$this->assertSame($project1, $project2);
	}
	
	function testGetSourceRepository() {	
		$this->assertEquals('cvs', getSourceRepository('/cvsroot/modeling/org.eclipse.emf/org.eclipse.emf.emf4net.releng')->getType());	
		$this->assertEquals('/cvsroot/modeling/org.eclipse.emf/org.eclipse.emf.emf4net.releng', getSourceRepository('/cvsroot/modeling/org.eclipse.emf/org.eclipse.emf.emf4net.releng')->getPath());
		$this->assertEquals('/cvsroot/modeling/org.eclipse.emf/org.eclipse.emf.emf4net.releng', getSourceRepository('/cvsroot/modeling/org.eclipse.emf/org.eclipse.emf.emf4net.releng/')->getPath());
		
		$this->assertEquals('svn', getSourceRepository('/technology/org.eclipse.imp')->getType());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('technology/org.eclipse.imp')->getPath());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('technology/org.eclipse.imp/')->getPath());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('/technology/org.eclipse.imp')->getPath());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('/technology/org.eclipse.imp/')->getPath());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('/svnroot/technology/org.eclipse.imp')->getPath());
		$this->assertEquals('/svnroot/technology/org.eclipse.imp', getSourceRepository('/svnroot/technology/org.eclipse.imp/')->getPath());
		
		$this->assertEquals('git', getSourceRepository('git://git.eclipse.org/gitroot/sketch/org.eclipse.sketch.git')->getType());
		$this->assertEquals('git', getSourceRepository('/gitroot/ecf/org.eclipse.ecf.git/')->getType());
		$this->assertEquals('git', getSourceRepository('/gitroot/ecf/org.eclipse.ecf.git')->getType());
		$this->assertEquals('git', getSourceRepository('git://egit.eclipse.org/egit.git')->getType());
		$this->assertEquals('/gitroot/sketch/org.eclipse.sketch.git', getSourceRepository('git://git.eclipse.org/gitroot/sketch/org.eclipse.sketch.git')->getPath());
		$this->assertEquals('/gitroot/ecf/org.eclipse.ecf.git', getSourceRepository('/gitroot/ecf/org.eclipse.ecf.git')->getPath());
		$this->assertEquals('/gitroot/ecf/org.eclipse.ecf.git', getSourceRepository('/gitroot/ecf/org.eclipse.ecf.git/')->getPath());
		$this->assertEquals('/gitroot/ecf/org.eclipse.ecf.git', getSourceRepository('http://git.eclipse.org/c/gitroot/ecf/org.eclipse.ecf.git/')->getPath());
	}
}

$App = new App();

$runner = new TestRunner("ProjectTests");
$runner->run_tests();

?>