| <?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␊ |
| }␊ |
| }␊ |
| ␊ |