統計
| ブランチ: | リビジョン:

pictcode / lib / Cake / Test / Case / Console / ConsoleOptionParserTest.php @ 0b1b8047

履歴 | 表示 | アノテート | ダウンロード (18.764 KB)

1
<?php
2
/**
3
 * ConsoleOptionParserTest file
4
 *
5
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
6
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
7
 *
8
 * Licensed under The MIT License
9
 * For full copyright and license information, please see the LICENSE.txt
10
 * Redistributions of files must retain the above copyright notice
11
 *
12
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
13
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
14
 * @package       Cake.Test.Case.Console
15
 * @since         CakePHP(tm) v 2.0
16
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
17
 */
18

    
19
App::uses('ConsoleOptionParser', 'Console');
20

    
21
/**
22
 * Class ConsoleOptionParserTest
23
 *
24
 * @package       Cake.Test.Case.Console
25
 */
26
class ConsoleOptionParserTest extends CakeTestCase {
27

    
28
/**
29
 * test setting the console description
30
 *
31
 * @return void
32
 */
33
        public function testDescription() {
34
                $parser = new ConsoleOptionParser('test', false);
35
                $result = $parser->description('A test');
36

    
37
                $this->assertEquals($parser, $result, 'Setting description is not chainable');
38
                $this->assertEquals('A test', $parser->description(), 'getting value is wrong.');
39

    
40
                $parser->description(array('A test', 'something'));
41
                $this->assertEquals("A test\nsomething", $parser->description(), 'getting value is wrong.');
42
        }
43

    
44
/**
45
 * test setting the console epilog
46
 *
47
 * @return void
48
 */
49
        public function testEpilog() {
50
                $parser = new ConsoleOptionParser('test', false);
51
                $result = $parser->epilog('A test');
52

    
53
                $this->assertEquals($parser, $result, 'Setting epilog is not chainable');
54
                $this->assertEquals('A test', $parser->epilog(), 'getting value is wrong.');
55

    
56
                $parser->epilog(array('A test', 'something'));
57
                $this->assertEquals("A test\nsomething", $parser->epilog(), 'getting value is wrong.');
58
        }
59

    
60
/**
61
 * test adding an option returns self.
62
 *
63
 * @return void
64
 */
65
        public function testAddOptionReturnSelf() {
66
                $parser = new ConsoleOptionParser('test', false);
67
                $result = $parser->addOption('test');
68
                $this->assertEquals($parser, $result, 'Did not return $this from addOption');
69
        }
70

    
71
/**
72
 * test adding an option and using the long value for parsing.
73
 *
74
 * @return void
75
 */
76
        public function testAddOptionLong() {
77
                $parser = new ConsoleOptionParser('test', false);
78
                $parser->addOption('test', array(
79
                        'short' => 't'
80
                ));
81
                $result = $parser->parse(array('--test', 'value'));
82
                $this->assertEquals(array('test' => 'value', 'help' => false), $result[0], 'Long parameter did not parse out');
83
        }
84

    
85
/**
86
 * test adding an option with a zero value
87
 *
88
 * @return void
89
 */
90
        public function testAddOptionZero() {
91
                $parser = new ConsoleOptionParser('test', false);
92
                $parser->addOption('count', array());
93
                $result = $parser->parse(array('--count', '0'));
94
                $this->assertEquals(array('count' => '0', 'help' => false), $result[0], 'Zero parameter did not parse out');
95
        }
96

    
97
/**
98
 * test addOption with an object.
99
 *
100
 * @return void
101
 */
102
        public function testAddOptionObject() {
103
                $parser = new ConsoleOptionParser('test', false);
104
                $parser->addOption(new ConsoleInputOption('test', 't'));
105
                $result = $parser->parse(array('--test=value'));
106
                $this->assertEquals(array('test' => 'value', 'help' => false), $result[0], 'Long parameter did not parse out');
107
        }
108

    
109
/**
110
 * test adding an option and using the long value for parsing.
111
 *
112
 * @return void
113
 */
114
        public function testAddOptionLongEquals() {
115
                $parser = new ConsoleOptionParser('test', false);
116
                $parser->addOption('test', array(
117
                        'short' => 't'
118
                ));
119
                $result = $parser->parse(array('--test=value'));
120
                $this->assertEquals(array('test' => 'value', 'help' => false), $result[0], 'Long parameter did not parse out');
121
        }
122

    
123
/**
124
 * test adding an option and using the default.
125
 *
126
 * @return void
127
 */
128
        public function testAddOptionDefault() {
129
                $parser = new ConsoleOptionParser('test', false);
130
                $parser->addOption('test', array(
131
                        'default' => 'default value',
132
                ));
133
                $result = $parser->parse(array('--test'));
134
                $this->assertEquals(array('test' => 'default value', 'help' => false), $result[0], 'Default value did not parse out');
135

    
136
                $parser = new ConsoleOptionParser('test', false);
137
                $parser->addOption('test', array(
138
                        'default' => 'default value',
139
                ));
140
                $result = $parser->parse(array());
141
                $this->assertEquals(array('test' => 'default value', 'help' => false), $result[0], 'Default value did not parse out');
142
        }
143

    
144
/**
145
 * test adding an option and using the short value for parsing.
146
 *
147
 * @return void
148
 */
149
        public function testAddOptionShort() {
150
                $parser = new ConsoleOptionParser('test', false);
151
                $parser->addOption('test', array(
152
                        'short' => 't'
153
                ));
154
                $result = $parser->parse(array('-t', 'value'));
155
                $this->assertEquals(array('test' => 'value', 'help' => false), $result[0], 'Short parameter did not parse out');
156
        }
157

    
158
/**
159
 * Test that adding an option using a two letter short value causes an exception.
160
 * As they will not parse correctly.
161
 *
162
 * @expectedException ConsoleException
163
 * @return void
164
 */
165
        public function testAddOptionShortOneLetter() {
166
                $parser = new ConsoleOptionParser('test', false);
167
                $parser->addOption('test', array('short' => 'te'));
168
        }
169

    
170
/**
171
 * test adding and using boolean options.
172
 *
173
 * @return void
174
 */
175
        public function testAddOptionBoolean() {
176
                $parser = new ConsoleOptionParser('test', false);
177
                $parser->addOption('test', array(
178
                        'boolean' => true,
179
                ));
180

    
181
                $result = $parser->parse(array('--test', 'value'));
182
                $expected = array(array('test' => true, 'help' => false), array('value'));
183
                $this->assertEquals($expected, $result);
184

    
185
                $result = $parser->parse(array('value'));
186
                $expected = array(array('test' => false, 'help' => false), array('value'));
187
                $this->assertEquals($expected, $result);
188
        }
189

    
190
/**
191
 * test adding an multiple shorts.
192
 *
193
 * @return void
194
 */
195
        public function testAddOptionMultipleShort() {
196
                $parser = new ConsoleOptionParser('test', false);
197
                $parser->addOption('test', array('short' => 't', 'boolean' => true))
198
                        ->addOption('file', array('short' => 'f', 'boolean' => true))
199
                        ->addOption('output', array('short' => 'o', 'boolean' => true));
200

    
201
                $result = $parser->parse(array('-o', '-t', '-f'));
202
                $expected = array('file' => true, 'test' => true, 'output' => true, 'help' => false);
203
                $this->assertEquals($expected, $result[0], 'Short parameter did not parse out');
204

    
205
                $result = $parser->parse(array('-otf'));
206
                $this->assertEquals($expected, $result[0], 'Short parameter did not parse out');
207
        }
208

    
209
/**
210
 * test multiple options at once.
211
 *
212
 * @return void
213
 */
214
        public function testMultipleOptions() {
215
                $parser = new ConsoleOptionParser('test', false);
216
                $parser->addOption('test')
217
                        ->addOption('connection')
218
                        ->addOption('table', array('short' => 't', 'default' => true));
219

    
220
                $result = $parser->parse(array('--test', 'value', '-t', '--connection', 'postgres'));
221
                $expected = array('test' => 'value', 'table' => true, 'connection' => 'postgres', 'help' => false);
222
                $this->assertEquals($expected, $result[0], 'multiple options did not parse');
223
        }
224

    
225
/**
226
 * Test adding multiple options.
227
 *
228
 * @return void
229
 */
230
        public function testAddOptions() {
231
                $parser = new ConsoleOptionParser('something', false);
232
                $result = $parser->addOptions(array(
233
                        'name' => array('help' => 'The name'),
234
                        'other' => array('help' => 'The other arg')
235
                ));
236
                $this->assertEquals($parser, $result, 'addOptions is not chainable.');
237

    
238
                $result = $parser->options();
239
                $this->assertEquals(3, count($result), 'Not enough options');
240
        }
241

    
242
/**
243
 * test that boolean options work
244
 *
245
 * @return void
246
 */
247
        public function testOptionWithBooleanParam() {
248
                $parser = new ConsoleOptionParser('test', false);
249
                $parser->addOption('no-commit', array('boolean' => true))
250
                        ->addOption('table', array('short' => 't'));
251

    
252
                $result = $parser->parse(array('--table', 'posts', '--no-commit', 'arg1', 'arg2'));
253
                $expected = array(array('table' => 'posts', 'no-commit' => true, 'help' => false), array('arg1', 'arg2'));
254
                $this->assertEquals($expected, $result, 'Boolean option did not parse correctly.');
255
        }
256

    
257
/**
258
 * test parsing options that do not exist.
259
 *
260
 * @expectedException ConsoleException
261
 * @return void
262
 */
263
        public function testOptionThatDoesNotExist() {
264
                $parser = new ConsoleOptionParser('test', false);
265
                $parser->addOption('no-commit', array('boolean' => true));
266

    
267
                $parser->parse(array('--fail', 'other'));
268
        }
269

    
270
/**
271
 * test parsing short options that do not exist.
272
 *
273
 * @expectedException ConsoleException
274
 * @return void
275
 */
276
        public function testShortOptionThatDoesNotExist() {
277
                $parser = new ConsoleOptionParser('test', false);
278
                $parser->addOption('no-commit', array('boolean' => true));
279

    
280
                $parser->parse(array('-f'));
281
        }
282

    
283
/**
284
 * test that options with choices enforce them.
285
 *
286
 * @expectedException ConsoleException
287
 * @return void
288
 */
289
        public function testOptionWithChoices() {
290
                $parser = new ConsoleOptionParser('test', false);
291
                $parser->addOption('name', array('choices' => array('mark', 'jose')));
292

    
293
                $result = $parser->parse(array('--name', 'mark'));
294
                $expected = array('name' => 'mark', 'help' => false);
295
                $this->assertEquals($expected, $result[0], 'Got the correct value.');
296

    
297
                $parser->parse(array('--name', 'jimmy'));
298
        }
299

    
300
/**
301
 * Ensure that option values can start with -
302
 *
303
 * @return void
304
 */
305
        public function testOptionWithValueStartingWithMinus() {
306
                $parser = new ConsoleOptionParser('test', false);
307
                $parser->addOption('name')
308
                        ->addOption('age');
309

    
310
                $result = $parser->parse(array('--name', '-foo', '--age', 'old'));
311
                $expected = array('name' => '-foo', 'age' => 'old', 'help' => false);
312
                $this->assertEquals($expected, $result[0], 'Option values starting with "-" are broken.');
313
        }
314

    
315
/**
316
 * test positional argument parsing.
317
 *
318
 * @return void
319
 */
320
        public function testPositionalArgument() {
321
                $parser = new ConsoleOptionParser('test', false);
322
                $result = $parser->addArgument('name', array('help' => 'An argument'));
323
                $this->assertEquals($parser, $result, 'Should return this');
324
        }
325

    
326
/**
327
 * test addOption with an object.
328
 *
329
 * @return void
330
 */
331
        public function testAddArgumentObject() {
332
                $parser = new ConsoleOptionParser('test', false);
333
                $parser->addArgument(new ConsoleInputArgument('test'));
334
                $result = $parser->arguments();
335
                $this->assertCount(1, $result);
336
                $this->assertEquals('test', $result[0]->name());
337
        }
338

    
339
/**
340
 * Test adding arguments out of order.
341
 *
342
 * @return void
343
 */
344
        public function testAddArgumentOutOfOrder() {
345
                $parser = new ConsoleOptionParser('test', false);
346
                $parser->addArgument('name', array('index' => 1, 'help' => 'first argument'))
347
                        ->addArgument('bag', array('index' => 2, 'help' => 'second argument'))
348
                        ->addArgument('other', array('index' => 0, 'help' => 'Zeroth argument'));
349

    
350
                $result = $parser->arguments();
351
                $this->assertCount(3, $result);
352
                $this->assertEquals('other', $result[0]->name());
353
                $this->assertEquals('name', $result[1]->name());
354
                $this->assertEquals('bag', $result[2]->name());
355
                $this->assertSame(array(0, 1, 2), array_keys($result));
356
        }
357

    
358
/**
359
 * test overwriting positional arguments.
360
 *
361
 * @return void
362
 */
363
        public function testPositionalArgOverwrite() {
364
                $parser = new ConsoleOptionParser('test', false);
365
                $parser->addArgument('name', array('help' => 'An argument'))
366
                        ->addArgument('other', array('index' => 0));
367

    
368
                $result = $parser->arguments();
369
                $this->assertEquals(1, count($result), 'Overwrite did not occur');
370
        }
371

    
372
/**
373
 * test parsing arguments.
374
 *
375
 * @expectedException ConsoleException
376
 * @return void
377
 */
378
        public function testParseArgumentTooMany() {
379
                $parser = new ConsoleOptionParser('test', false);
380
                $parser->addArgument('name', array('help' => 'An argument'))
381
                        ->addArgument('other');
382

    
383
                $expected = array('one', 'two');
384
                $result = $parser->parse($expected);
385
                $this->assertEquals($expected, $result[1], 'Arguments are not as expected');
386

    
387
                $parser->parse(array('one', 'two', 'three'));
388
        }
389

    
390
/**
391
 * test parsing arguments with 0 value.
392
 *
393
 * @return void
394
 */
395
        public function testParseArgumentZero() {
396
                $parser = new ConsoleOptionParser('test', false);
397

    
398
                $expected = array('one', 'two', 0, 'after', 'zero');
399
                $result = $parser->parse($expected);
400
                $this->assertEquals($expected, $result[1], 'Arguments are not as expected');
401
        }
402

    
403
/**
404
 * test that when there are not enough arguments an exception is raised
405
 *
406
 * @expectedException ConsoleException
407
 * @return void
408
 */
409
        public function testPositionalArgNotEnough() {
410
                $parser = new ConsoleOptionParser('test', false);
411
                $parser->addArgument('name', array('required' => true))
412
                        ->addArgument('other', array('required' => true));
413

    
414
                $parser->parse(array('one'));
415
        }
416

    
417
/**
418
 * test that arguments with choices enforce them.
419
 *
420
 * @expectedException ConsoleException
421
 * @return void
422
 */
423
        public function testPositionalArgWithChoices() {
424
                $parser = new ConsoleOptionParser('test', false);
425
                $parser->addArgument('name', array('choices' => array('mark', 'jose')))
426
                        ->addArgument('alias', array('choices' => array('cowboy', 'samurai')))
427
                        ->addArgument('weapon', array('choices' => array('gun', 'sword')));
428

    
429
                $result = $parser->parse(array('mark', 'samurai', 'sword'));
430
                $expected = array('mark', 'samurai', 'sword');
431
                $this->assertEquals($expected, $result[1], 'Got the correct value.');
432

    
433
                $parser->parse(array('jose', 'coder'));
434
        }
435

    
436
/**
437
 * Test adding multiple arguments.
438
 *
439
 * @return void
440
 */
441
        public function testAddArguments() {
442
                $parser = new ConsoleOptionParser('test', false);
443
                $result = $parser->addArguments(array(
444
                        'name' => array('help' => 'The name'),
445
                        'other' => array('help' => 'The other arg')
446
                ));
447
                $this->assertEquals($parser, $result, 'addArguments is not chainable.');
448

    
449
                $result = $parser->arguments();
450
                $this->assertEquals(2, count($result), 'Not enough arguments');
451
        }
452

    
453
/**
454
 * test setting a subcommand up.
455
 *
456
 * @return void
457
 */
458
        public function testSubcommand() {
459
                $parser = new ConsoleOptionParser('test', false);
460
                $result = $parser->addSubcommand('initdb', array(
461
                        'help' => 'Initialize the database'
462
                ));
463
                $this->assertEquals($parser, $result, 'Adding a subcommand is not chainable');
464
        }
465

    
466
/**
467
 * test addSubcommand with an object.
468
 *
469
 * @return void
470
 */
471
        public function testAddSubcommandObject() {
472
                $parser = new ConsoleOptionParser('test', false);
473
                $parser->addSubcommand(new ConsoleInputSubcommand('test'));
474
                $result = $parser->subcommands();
475
                $this->assertEquals(1, count($result));
476
                $this->assertEquals('test', $result['test']->name());
477
        }
478

    
479
/**
480
 * test removeSubcommand with an object.
481
 *
482
 * @return void
483
 */
484
        public function testRemoveSubcommand() {
485
                $parser = new ConsoleOptionParser('test', false);
486
                $parser->addSubcommand(new ConsoleInputSubcommand('test'));
487
                $result = $parser->subcommands();
488
                $this->assertEquals(1, count($result));
489
                $parser->removeSubcommand('test');
490
                $result = $parser->subcommands();
491
                $this->assertEquals(0, count($result), 'Remove a subcommand does not work');
492
        }
493

    
494
/**
495
 * test adding multiple subcommands
496
 *
497
 * @return void
498
 */
499
        public function testAddSubcommands() {
500
                $parser = new ConsoleOptionParser('test', false);
501
                $result = $parser->addSubcommands(array(
502
                        'initdb' => array('help' => 'Initialize the database'),
503
                        'create' => array('help' => 'Create something')
504
                ));
505
                $this->assertEquals($parser, $result, 'Adding a subcommands is not chainable');
506
                $result = $parser->subcommands();
507
                $this->assertEquals(2, count($result), 'Not enough subcommands');
508
        }
509

    
510
/**
511
 * test that no exception is triggered when help is being generated
512
 *
513
 * @return void
514
 */
515
        public function testHelpNoExceptionWhenGettingHelp() {
516
                $parser = new ConsoleOptionParser('mycommand', false);
517
                $parser->addOption('test', array('help' => 'A test option.'))
518
                        ->addArgument('model', array('help' => 'The model to make.', 'required' => true));
519

    
520
                $result = $parser->parse(array('--help'));
521
                $this->assertTrue($result[0]['help']);
522
        }
523

    
524
/**
525
 * test that help() with a command param shows the help for a subcommand
526
 *
527
 * @return void
528
 */
529
        public function testHelpSubcommandHelp() {
530
                $subParser = new ConsoleOptionParser('method', false);
531
                $subParser->addOption('connection', array('help' => 'Db connection.'));
532

    
533
                $parser = new ConsoleOptionParser('mycommand', false);
534
                $parser->addSubcommand('method', array(
535
                                'help' => 'This is another command',
536
                                'parser' => $subParser
537
                        ))
538
                        ->addOption('test', array('help' => 'A test option.'));
539

    
540
                $result = $parser->help('method');
541
                $expected = <<<TEXT
542
<info>Usage:</info>
543
cake mycommand method [-h] [--connection]
544

545
<info>Options:</info>
546

547
--help, -h        Display this help.
548
--connection      Db connection.
549

550
TEXT;
551
                $this->assertTextEquals($expected, $result, 'Help is not correct.');
552
        }
553

    
554
/**
555
 * test building a parser from an array.
556
 *
557
 * @return void
558
 */
559
        public function testBuildFromArray() {
560
                $spec = array(
561
                        'command' => 'test',
562
                        'arguments' => array(
563
                                'name' => array('help' => 'The name'),
564
                                'other' => array('help' => 'The other arg')
565
                        ),
566
                        'options' => array(
567
                                'name' => array('help' => 'The name'),
568
                                'other' => array('help' => 'The other arg')
569
                        ),
570
                        'subcommands' => array(
571
                                'initdb' => array('help' => 'make database')
572
                        ),
573
                        'description' => 'description text',
574
                        'epilog' => 'epilog text'
575
                );
576
                $parser = ConsoleOptionParser::buildFromArray($spec);
577

    
578
                $this->assertEquals($spec['description'], $parser->description());
579
                $this->assertEquals($spec['epilog'], $parser->epilog());
580

    
581
                $options = $parser->options();
582
                $this->assertTrue(isset($options['name']));
583
                $this->assertTrue(isset($options['other']));
584

    
585
                $args = $parser->arguments();
586
                $this->assertEquals(2, count($args));
587

    
588
                $commands = $parser->subcommands();
589
                $this->assertEquals(1, count($commands));
590
        }
591

    
592
/**
593
 * test that create() returns instances
594
 *
595
 * @return void
596
 */
597
        public function testCreateFactory() {
598
                $parser = ConsoleOptionParser::create('factory', false);
599
                $this->assertInstanceOf('ConsoleOptionParser', $parser);
600
                $this->assertEquals('factory', $parser->command());
601
        }
602

    
603
/**
604
 * test that command() inflects the command name.
605
 *
606
 * @return void
607
 */
608
        public function testCommandInflection() {
609
                $parser = new ConsoleOptionParser('CommandLine');
610
                $this->assertEquals('command_line', $parser->command());
611
        }
612

    
613
/**
614
 * test that parse() takes a subcommand argument, and that the subcommand parser
615
 * is used.
616
 *
617
 * @return void
618
 */
619
        public function testParsingWithSubParser() {
620
                $parser = new ConsoleOptionParser('test', false);
621
                $parser->addOption('primary')
622
                        ->addArgument('one', array('required' => true, 'choices' => array('a', 'b')))
623
                        ->addArgument('two', array('required' => true))
624
                        ->addSubcommand('sub', array(
625
                                'parser' => array(
626
                                        'options' => array(
627
                                                'secondary' => array('boolean' => true),
628
                                                'fourth' => array('help' => 'fourth option')
629
                                        ),
630
                                        'arguments' => array(
631
                                                'sub_arg' => array('choices' => array('c', 'd'))
632
                                        )
633
                                )
634
                        ));
635

    
636
                $result = $parser->parse(array('--secondary', '--fourth', '4', 'c'), 'sub');
637
                $expected = array(array(
638
                        'secondary' => true,
639
                        'fourth' => '4',
640
                        'help' => false,
641
                        'verbose' => false,
642
                        'quiet' => false), array('c'));
643
                $this->assertEquals($expected, $result, 'Sub parser did not parse request.');
644
        }
645

    
646
}