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 =<<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 } }