1<?php
2require_once 'VersionControl/Git.php';
3
4require_once dirname(__FILE__) . '/checkFixtures.php';
5
6class DummyGitCommand extends VersionControl_Git_Util_Command
7{
8  public function getCommandString($arguments = array(), $options = array())
9  {
10    return $this->createCommandString($arguments, $options);
11  }
12
13  public function getProperty($name)
14  {
15    return $this->$name;
16  }
17}
18
19class VersionControl_Git_Util_CommandTest extends PHPUnit_Framework_TestCase
20{
21  public function testConstruct()
22  {
23    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
24    $instance = new DummyGitCommand($git);
25
26    $this->assertTrue($instance instanceof VersionControl_Git_Util_Command);
27  }
28
29  public function testSetSubCommand()
30  {
31    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
32    $instance = new DummyGitCommand($git);
33
34    $this->assertEquals($instance->getProperty('subCommand'), '');
35
36    $instance->setSubCommand('subcommand');
37
38    $this->assertEquals($instance->getProperty('subCommand'), 'subcommand');
39  }
40
41  public function testSetOptions()
42  {
43    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
44    $instance = new DummyGitCommand($git);
45
46    $this->assertEquals($instance->getProperty('options'), array());
47
48    $options1 = array('option1' => time() * 1, 'option2' => time() * 2);
49    $instance->setOptions($options1);
50    $this->assertEquals($instance->getProperty('options'), $options1);
51
52    $options2 = array('option3' => time() * 3, 'option4' => time() * 4);
53    $instance->setOptions($options2);
54    $this->assertEquals($instance->getProperty('options'), $options2);
55  }
56
57  public function testSetArguments()
58  {
59    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
60    $instance = new DummyGitCommand($git);
61
62    $this->assertEquals($instance->getProperty('arguments'), array());
63
64    $arguments1 = array(time() * 1, time() * 2);
65    $instance->setArguments($arguments1);
66    $this->assertEquals($instance->getProperty('arguments'), $arguments1);
67
68    $arguments2 = array(time() * 3, time() * 4);
69    $instance->setArguments($arguments2);
70    $this->assertEquals($instance->getProperty('arguments'), $arguments2);
71  }
72
73  public function testSetOption()
74  {
75    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
76    $instance = new DummyGitCommand($git);
77
78    $options1 = array('option1' => time() * 1, 'option2' => time() * 2);
79    $instance->setOptions($options1);
80    $this->assertEquals($instance->getProperty('options'), $options1);
81
82    $newOption = time() * 3;
83    $instance->setOption('option1', $newOption);
84    $this->assertEquals($instance->getProperty('options'), array('option1' => $newOption, 'option2' => $options1['option2']));
85  }
86
87  public function testAddArgument()
88  {
89    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
90    $instance = new DummyGitCommand($git);
91
92    $arguments = array(1, 2, 3);
93    $instance->setArguments($arguments);
94    $this->assertEquals($instance->getProperty('arguments'), $arguments);
95
96    $instance->addArgument(4);
97    $this->assertEquals($instance->getProperty('arguments'), array(1, 2, 3, 4));
98  }
99
100  public function testAddDoubleDash()
101  {
102    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
103    $instance = new DummyGitCommand($git);
104
105    $this->assertEquals($instance->getProperty('doubleDash'), false);
106    $instance->addDoubleDash(true);
107    $this->assertEquals($instance->getProperty('doubleDash'), true);
108    $instance->addDoubleDash(false);
109    $this->assertEquals($instance->getProperty('doubleDash'), false);
110  }
111
112  public function testCreateCommandStringException()
113  {
114    $this->setExpectedException('VersionControl_Git_Exception');
115
116    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
117    $instance = new DummyGitCommand($git);
118
119    $instance->getCommandString();
120  }
121
122  public function testCreateCommandString()
123  {
124    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
125    $i1 = new DummyGitCommand($git);
126
127    $i1->setSubCommand('subcommand');
128
129    $pathToGit = @System::which('git');
130
131    $this->assertEquals($i1->getCommandString(), $pathToGit.' subcommand');
132    $this->assertEquals($i1->getCommandString(array('a1', 'a2')), $pathToGit.' subcommand \'a1\' \'a2\'');
133    $this->assertEquals($i1->getCommandString(array(), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o');
134    $this->assertEquals($i1->getCommandString(array('a1', 'a2'), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o \'a1\' \'a2\'');
135
136    $i2 = clone $i1;
137    $i2->setArguments(array('A1', 'A2'));
138
139    $this->assertEquals($i2->getCommandString(), $pathToGit.' subcommand \'A1\' \'A2\'');
140    $this->assertEquals($i2->getCommandString(array('a1', 'a2')), $pathToGit.' subcommand \'A1\' \'A2\' \'a1\' \'a2\'');
141    $this->assertEquals($i2->getCommandString(array(), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o \'A1\' \'A2\'');
142    $this->assertEquals($i2->getCommandString(array('a1', 'a2'), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o \'A1\' \'A2\' \'a1\' \'a2\'');
143
144    $i3 = clone $i1;
145    $i3->setOptions(array('O1' => 'V1', 'o2' => 'V2'));
146
147    $this->assertEquals($i3->getCommandString(), $pathToGit.' subcommand --O1=\'V1\' --o2=\'V2\'');
148    $this->assertEquals($i3->getCommandString(array('a1', 'a2')), $pathToGit.' subcommand --O1=\'V1\' --o2=\'V2\' \'a1\' \'a2\'');
149    $this->assertEquals($i3->getCommandString(array(), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --O1=\'V1\' --o2 --o1=\'v1\' -o');
150    $this->assertEquals($i3->getCommandString(array('a1', 'a2'), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --O1=\'V1\' --o2 --o1=\'v1\' -o \'a1\' \'a2\'');
151
152    $i4 = clone $i1;
153    $i4->addDoubleDash(true);
154
155    $this->assertEquals($i4->getCommandString(), $pathToGit.' subcommand --');
156    $this->assertEquals($i4->getCommandString(array('a1', 'a2')), $pathToGit.' subcommand \'a1\' \'a2\' --');
157    $this->assertEquals($i4->getCommandString(array(), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o --');
158    $this->assertEquals($i4->getCommandString(array('a1', 'a2'), array('o1' => 'v1', 'o2' => true, 'o3' => false, 'o' => true)), $pathToGit.' subcommand --o1=\'v1\' --o2 -o \'a1\' \'a2\' --');
159  }
160
161  public function testExecuteException()
162  {
163    $this->setExpectedException('VersionControl_Git_Exception');
164
165    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
166    $i1 = new DummyGitCommand($git);
167
168    $i1->setSubCommand('subcommand')
169      ->execute();
170  }
171
172  public function testExecute()
173  {
174    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
175    $i1 = new DummyGitCommand($git);
176
177    $result = $i1->setSubCommand('log')
178      ->setOption('pretty', 'oneline')
179      ->setOption('grep', 'initial')
180      ->execute();
181
182    $this->assertEquals(trim($result), 'b8adc7214881bb71b9741b5d8228ebf346197d47 initial commit');
183  }
184
185  public function testExecuteWithShortFormatOption()
186  {
187    $git = new VersionControl_Git(dirname(__FILE__) . '/fixtures/001_VersionControl_Git');
188    $i1 = new DummyGitCommand($git);
189
190    $result = $i1->setSubCommand('log')
191      ->setOption('n', '1')
192      ->setOption('pretty', 'oneline')
193      ->setOption('grep', 'initial')
194      ->execute();
195
196    $this->assertEquals($i1->getCommandString(), @System::which('git').' log -n\'1\' --pretty=\'oneline\' --grep=\'initial\'');
197    $this->assertEquals(trim($result), 'b8adc7214881bb71b9741b5d8228ebf346197d47 initial commit');
198  }
199}
200