| <?php␊ | 
| /* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ | 
| /*␊ | 
| # ***** BEGIN LICENSE BLOCK *****␊ | 
| # This file is part of InDefero, an open source project management application.␊ | 
| # Copyright (C) 2011 CĂ©ondo Ltd and contributors.␊ | 
| #␊ | 
| # InDefero 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.␊ | 
| #␊ | 
| # InDefero 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, write to the Free Software␊ | 
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA␊ | 
| #␊ | 
| # ***** END LICENSE BLOCK ***** */␊ | 
| ␊ | 
| class MonotoneStdioMock implements IDF_Scm_Monotone_IStdio␊ | 
| {␊ | 
| // unused␊ | 
| public function __construct(IDF_Project $project) {}␊ | 
| ␊ | 
| // unused␊ | 
| public function start() {}␊ | 
| ␊ | 
| // unused␊ | 
| public function stop() {}␊ | 
| ␊ | 
| private $outputMap = array();␊ | 
| ␊ | 
| public function setExpectedOutput(array $args, array $options, $output)␊ | 
| {␊ | 
| @$this->outputMap[serialize($args)][serialize($options)] = $output;␊ | 
| }␊ | 
| ␊ | 
| public function exec(array $args, array $options = array())␊ | 
| {␊ | 
| $optoutputs = @$this->outputMap[serialize($args)];␊ | 
| if ($optoutputs === null) {␊ | 
| return false;␊ | 
| }␊ | 
| ␊ | 
| return @$optoutputs[serialize($options)];␊ | 
| }␊ | 
| ␊ | 
| // unused␊ | 
| public function getLastOutOfBandOutput() {}␊ | 
| }␊ | 
| ␊ | 
| class IDF_Scm_Monotone_Test extends PHPUnit_Framework_TestCase␊ | 
| {␊ | 
| private $proj = null;␊ | 
| ␊ | 
| public function setUp()␊ | 
| {␊ | 
| $this->proj = new IDF_Project();␊ | 
| $this->proj->id = 1;␊ | 
| $this->proj->name = $this->proj->shortname = 'Test';␊ | 
| $this->proj->create();␊ | 
| ␊ | 
| $this->proj->getConf()->setVal('mtn_master_branch', 'master.branch');␊ | 
| }␊ | 
| ␊ | 
| public function tearDown()␊ | 
| {␊ | 
| $this->proj->delete();␊ | 
| }␊ | 
| ␊ | 
| public function createMock(array $args = array(), array $options = array(), $output = null)␊ | 
| {␊ | 
| $instance = new IDF_Scm_Monotone($this->proj, new MonotoneStdioMock($this->proj));␊ | 
| if (count($args) > 0) {␊ | 
| $instance->getStdio()->setExpectedOutput($args, $options, $output);␊ | 
| }␊ | 
| return $instance;␊ | 
| }␊ | 
| ␊ | 
| public function testGetStdio()␊ | 
| {␊ | 
| $instance = $this->createMock();␊ | 
| $this->assertNotNull($instance->getStdio());␊ | 
| }␊ | 
| ␊ | 
| public function testGetRepositorySize()␊ | 
| {␊ | 
| $this->markTestSkipped('Cannot mock real repository file');␊ | 
| }␊ | 
| ␊ | 
| public function testIsAvailable()␊ | 
| {␊ | 
| $instance = $this->createMock(array('interface_version'), array(), '13.0');␊ | 
| $this->assertTrue($instance->isAvailable());␊ | 
| ␊ | 
| $instance->getStdio()->setExpectedOutput(array('interface_version'), array(), '12.7');␊ | 
| $this->assertFalse($instance->isAvailable());␊ | 
| ␊ | 
| $instance->getStdio()->setExpectedOutput(array('interface_version'), array(), 'foo');␊ | 
| $this->assertFalse($instance->isAvailable());␊ | 
| }␊ | 
| ␊ | 
| public function testGetBranches()␊ | 
| {␊ | 
| $instance = $this->createMock(array('branches'), array(), "foo\nbar.baz");␊ | 
| $this->assertEquals(array(␊ | 
| 'h:foo' => 'foo',␊ | 
| 'h:bar.baz' => 'bar.baz',␊ | 
| ), $instance->getBranches());␊ | 
| }␊ | 
| ␊ | 
| public function testGetMainBranch()␊ | 
| {␊ | 
| $instance = $this->createMock();␊ | 
| $this->assertEquals('master.branch', $instance->getMainBranch());␊ | 
| $instance->project->getConf()->setVal('mtn_master_branch', '');␊ | 
| $this->assertEquals('*', $instance->getMainBranch());␊ | 
| }␊ | 
| ␊ | 
| public function testGetArchiveStream()␊ | 
| {␊ | 
| $instance = $this->createMock(array('select', 'abc123'), array(), "1234567890123456789012345678901234567890\n");␊ | 
| $ziprender = $instance->getArchiveStream('abc123');␊ | 
| $this->assertTrue($ziprender instanceof IDF_Scm_Monotone_ZipRender);␊ | 
| ␊ | 
| $thrown = false;␊ | 
| try {␊ | 
| $ziprender = $instance->getArchiveStream('foo');␊ | 
| }␊ | 
| catch (IDF_Scm_Exception $e) {␊ | 
| $thrown = true;␊ | 
| }␊ | 
| $this->assertTrue($thrown);␊ | 
| }␊ | 
| ␊ | 
| public function testInBranches()␊ | 
| {␊ | 
| // returns the branches the given commit is in␊ | 
| }␊ | 
| ␊ | 
| public function testGetTags()␊ | 
| {␊ | 
| $stdio =<<<END␊ | 
| tag "foo-1.0"␊ | 
| revision [5db0a3dfb923d050d096c7c63ab23592c7ebc4c3]␊ | 
| signer [de84b575d5e47254393eba49dce9dc4db98ed42d]␊ | 
| branches "org.company.foo"␊ | 
| ␊ | 
| tag "foo-1.1"␊ | 
| revision [a4a773ecc74c1b80a03c60f57c6cc7bec85fb2cf]␊ | 
| signer [7fe029d85af4de40700778b9784ef488fac2c79c]␊ | 
| branches "org.company.foo"␊ | 
| ␊ | 
| tag "bar-1.0"␊ | 
| revision [09a00eb14482dde8876436351c6c4392b1e7f0b1]␊ | 
| signer [7fe029d85af4de40700778b9784ef488fac2c79c]␊ | 
| branches "org.company.bar" "org.company.bar.release-1.0"␊ | 
| END;␊ | 
| $instance = $this->createMock(array('tags'), array(), $stdio);␊ | 
| $this->assertEquals(array(␊ | 
| 't:foo-1.0' => 'foo-1.0',␊ | 
| 't:foo-1.1' => 'foo-1.1',␊ | 
| 't:bar-1.0' => 'bar-1.0',␊ | 
| ), $instance->getTags());␊ | 
| }␊ | 
| ␊ | 
| public function testInTags()␊ | 
| {␊ | 
| // returns the tags that are attached to the given commit␊ | 
| }␊ | 
| ␊ | 
| public function testGetTree()␊ | 
| {␊ | 
| // test root and sub tree fetching␊ | 
| }␊ | 
| ␊ | 
| public function testFindAuthor()␊ | 
| {␊ | 
| $this->markTestSkipped('This functionality here should reside in IDF_Scm');␊ | 
| }␊ | 
| ␊ | 
| public function testGetAnonymousAccessUrl()␊ | 
| {␊ | 
| // test the generation of the anonymous remote URL␊ | 
| }␊ | 
| ␊ | 
| public function testGetAuthAccessUrl()␊ | 
| {␊ | 
| // test the generation of the authenticated remote URL (only really visible for SSH)␊ | 
| }␊ | 
| ␊ | 
| public function testFactory()␊ | 
| {␊ | 
| $this->markTestSkipped('Cannot mock real repository');␊ | 
| }␊ | 
| ␊ | 
| public function testValidateRevision()␊ | 
| {␊ | 
| // test valid, invalid and ambigious␊ | 
| }␊ | 
| ␊ | 
| public function testDisambiguateRevision()␊ | 
| {␊ | 
| // test for array of commit objects␊ | 
| }␊ | 
| ␊ | 
| public function testGetPathInfo()␊ | 
| {␊ | 
| // return the info (creation date, last commit, et cetera) for a single file and commit␊ | 
| }␊ | 
| ␊ | 
| public function testGetFile()␊ | 
| {␊ | 
| // test cmd_only and full file fetching␊ | 
| }␊ | 
| ␊ | 
| public function testGetChanges()␊ | 
| {␊ | 
| // test retrieving the changes of a specific revision␊ | 
| }␊ | 
| ␊ | 
| public function testGetCommit()␊ | 
| {␊ | 
| // test get commit information with and without a diff text␊ | 
| // test multiple branches, dates, authors, aso␊ | 
| }␊ | 
| ␊ | 
| public function testGetExtraProperties()␊ | 
| {␊ | 
| // test array('parents' => array(rev1, rev2, ...)) or array() if root revision␊ | 
| }␊ | 
| ␊ | 
| public function testIsCommitLarge()␊ | 
| {␊ | 
| // test for true / false with commits with more than 100 changes␊ | 
| }␊ | 
| ␊ | 
| public function testGetChangeLog()␊ | 
| {␊ | 
| // test with no commit, empty $n␊ | 
| // test logging stops at unknown branches␊ | 
| // test logging stops at $n␊ | 
| }␊ | 
| }␊ | 
| ␊ |