<?php 
/*******************************************************************************
 * Copyright (c) 2010, 2016 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/TestRunner.class.php';

class ProjectTests extends TestCase {
	
	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 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();

?>