2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Console\Tests\Helper ;
use Symfony\Component\Console\Helper\Table ;
use Symfony\Component\Console\Helper\TableStyle ;
use Symfony\Component\Console\Helper\TableSeparator ;
use Symfony\Component\Console\Helper\TableCell ;
use Symfony\Component\Console\Output\StreamOutput ;
class TableTest extends \PHPUnit_Framework_TestCase
{
protected $stream ;
protected function setUp ()
{
$this -> stream = fopen ( 'php://memory' , 'r+' );
}
protected function tearDown ()
{
fclose ( $this -> stream );
$this -> stream = null ;
}
/**
* @ dataProvider testRenderProvider
*/
public function testRender ( $headers , $rows , $style , $expected )
{
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( $headers )
-> setRows ( $rows )
-> setStyle ( $style )
;
$table -> render ();
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
}
/**
* @ dataProvider testRenderProvider
*/
public function testRenderAddRows ( $headers , $rows , $style , $expected )
{
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( $headers )
-> addRows ( $rows )
-> setStyle ( $style )
;
$table -> render ();
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
}
/**
* @ dataProvider testRenderProvider
*/
public function testRenderAddRowsOneByOne ( $headers , $rows , $style , $expected )
{
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( $headers )
-> setStyle ( $style )
;
foreach ( $rows as $row ) {
$table -> addRow ( $row );
}
$table -> render ();
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
}
public function testRenderProvider ()
{
$books = array (
array ( '99921-58-10-7' , 'Divine Comedy' , 'Dante Alighieri' ),
array ( '9971-5-0210-0' , 'A Tale of Two Cities' , 'Charles Dickens' ),
array ( '960-425-059-0' , 'The Lord of the Rings' , 'J. R. R. Tolkien' ),
array ( '80-902734-1-6' , 'And Then There Were None' , 'Agatha Christie' ),
);
return array (
array (
array ( 'ISBN' , 'Title' , 'Author' ),
$books ,
'default' ,
<<< TABLE
+---------------+--------------------------+------------------+
| ISBN | Title | Author |
+---------------+--------------------------+------------------+
| 99921 - 58 - 10 - 7 | Divine Comedy | Dante Alighieri |
| 9971 - 5 - 0210 - 0 | A Tale of Two Cities | Charles Dickens |
| 960 - 425 - 05 9 - 0 | The Lord of the Rings | J . R . R . Tolkien |
| 80 - 902734 - 1 - 6 | And Then There Were None | Agatha Christie |
+---------------+--------------------------+------------------+
TABLE
),
array (
array ( 'ISBN' , 'Title' , 'Author' ),
$books ,
'compact' ,
<<< TABLE
ISBN Title Author
99921 - 58 - 10 - 7 Divine Comedy Dante Alighieri
9971 - 5 - 0210 - 0 A Tale of Two Cities Charles Dickens
960 - 425 - 05 9 - 0 The Lord of the Rings J . R . R . Tolkien
80 - 902734 - 1 - 6 And Then There Were None Agatha Christie
TABLE
),
array (
array ( 'ISBN' , 'Title' , 'Author' ),
$books ,
'borderless' ,
<<< TABLE
=============== ========================== ==================
ISBN Title Author
=============== ========================== ==================
99921 - 58 - 10 - 7 Divine Comedy Dante Alighieri
9971 - 5 - 0210 - 0 A Tale of Two Cities Charles Dickens
960 - 425 - 05 9 - 0 The Lord of the Rings J . R . R . Tolkien
80 - 902734 - 1 - 6 And Then There Were None Agatha Christie
=============== ========================== ==================
TABLE
),
array (
array ( 'ISBN' , 'Title' ),
array (
array ( '99921-58-10-7' , 'Divine Comedy' , 'Dante Alighieri' ),
array ( '9971-5-0210-0' ),
array ( '960-425-059-0' , 'The Lord of the Rings' , 'J. R. R. Tolkien' ),
array ( '80-902734-1-6' , 'And Then There Were None' , 'Agatha Christie' ),
),
'default' ,
<<< TABLE
+---------------+--------------------------+------------------+
| ISBN | Title | |
+---------------+--------------------------+------------------+
| 99921 - 58 - 10 - 7 | Divine Comedy | Dante Alighieri |
| 9971 - 5 - 0210 - 0 | | |
| 960 - 425 - 05 9 - 0 | The Lord of the Rings | J . R . R . Tolkien |
| 80 - 902734 - 1 - 6 | And Then There Were None | Agatha Christie |
+---------------+--------------------------+------------------+
TABLE
),
array (
array (),
array (
array ( '99921-58-10-7' , 'Divine Comedy' , 'Dante Alighieri' ),
array ( '9971-5-0210-0' ),
array ( '960-425-059-0' , 'The Lord of the Rings' , 'J. R. R. Tolkien' ),
array ( '80-902734-1-6' , 'And Then There Were None' , 'Agatha Christie' ),
),
'default' ,
<<< TABLE
+---------------+--------------------------+------------------+
| 99921 - 58 - 10 - 7 | Divine Comedy | Dante Alighieri |
| 9971 - 5 - 0210 - 0 | | |
| 960 - 425 - 05 9 - 0 | The Lord of the Rings | J . R . R . Tolkien |
| 80 - 902734 - 1 - 6 | And Then There Were None | Agatha Christie |
+---------------+--------------------------+------------------+
TABLE
),
array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
2015-08-27 12:03:05 -07:00
array ( '99921-58-10-7' , " Divine \n Comedy " , 'Dante Alighieri' ),
array ( '9971-5-0210-2' , " Harry Potter \n and the Chamber of Secrets " , " Rowling \n Joanne K. " ),
array ( '9971-5-0210-2' , " Harry Potter \n and the Chamber of Secrets " , " Rowling \n Joanne K. " ),
array ( '960-425-059-0' , 'The Lord of the Rings' , " J. R. R. \n Tolkien " ),
2015-08-17 17:00:26 -07:00
),
'default' ,
<<< TABLE
+---------------+----------------------------+-----------------+
| ISBN | Title | Author |
+---------------+----------------------------+-----------------+
| 99921 - 58 - 10 - 7 | Divine | Dante Alighieri |
| | Comedy | |
| 9971 - 5 - 0210 - 2 | Harry Potter | Rowling |
| | and the Chamber of Secrets | Joanne K . |
| 9971 - 5 - 0210 - 2 | Harry Potter | Rowling |
| | and the Chamber of Secrets | Joanne K . |
| 960 - 425 - 05 9 - 0 | The Lord of the Rings | J . R . R . |
| | | Tolkien |
+---------------+----------------------------+-----------------+
TABLE
),
array (
array ( 'ISBN' , 'Title' ),
array (),
'default' ,
<<< TABLE
+------+-------+
| ISBN | Title |
+------+-------+
TABLE
),
array (
array (),
array (),
'default' ,
'' ,
),
'Cell text with tags used for Output styling' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array ( '<info>99921-58-10-7</info>' , '<error>Divine Comedy</error>' , '<fg=blue;bg=white>Dante Alighieri</fg=blue;bg=white>' ),
array ( '9971-5-0210-0' , 'A Tale of Two Cities' , '<info>Charles Dickens</>' ),
),
'default' ,
<<< TABLE
+---------------+----------------------+-----------------+
| ISBN | Title | Author |
+---------------+----------------------+-----------------+
| 99921 - 58 - 10 - 7 | Divine Comedy | Dante Alighieri |
| 9971 - 5 - 0210 - 0 | A Tale of Two Cities | Charles Dickens |
+---------------+----------------------+-----------------+
TABLE
),
'Cell text with tags not used for Output styling' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array ( '<strong>99921-58-10-700</strong>' , '<f>Divine Com</f>' , 'Dante Alighieri' ),
array ( '9971-5-0210-0' , 'A Tale of Two Cities' , 'Charles Dickens' ),
),
'default' ,
<<< TABLE
+----------------------------------+----------------------+-----------------+
| ISBN | Title | Author |
+----------------------------------+----------------------+-----------------+
| < strong > 99921 - 58 - 10 - 700 </ strong > | < f > Divine Com </ f > | Dante Alighieri |
| 9971 - 5 - 0210 - 0 | A Tale of Two Cities | Charles Dickens |
+----------------------------------+----------------------+-----------------+
TABLE
),
'Cell with colspan' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array ( '99921-58-10-7' , 'Divine Comedy' , 'Dante Alighieri' ),
new TableSeparator (),
array ( new TableCell ( 'Divine Comedy(Dante Alighieri)' , array ( 'colspan' => 3 ))),
new TableSeparator (),
array (
new TableCell ( 'Arduino: A Quick-Start Guide' , array ( 'colspan' => 2 )),
'Mark Schmidt' ,
),
new TableSeparator (),
array (
'9971-5-0210-0' ,
new TableCell ( " A Tale of \n Two Cities " , array ( 'colspan' => 2 )),
),
),
'default' ,
<<< TABLE
+----------------+---------------+-----------------+
| ISBN | Title | Author |
+----------------+---------------+-----------------+
| 99921 - 58 - 10 - 7 | Divine Comedy | Dante Alighieri |
+----------------+---------------+-----------------+
| Divine Comedy ( Dante Alighieri ) |
+----------------+---------------+-----------------+
| Arduino : A Quick - Start Guide | Mark Schmidt |
+----------------+---------------+-----------------+
| 9971 - 5 - 0210 - 0 | A Tale of |
| | Two Cities |
+----------------+---------------+-----------------+
TABLE
),
'Cell with rowspan' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array (
new TableCell ( '9971-5-0210-0' , array ( 'rowspan' => 3 )),
'Divine Comedy' ,
'Dante Alighieri' ,
),
array ( 'A Tale of Two Cities' , 'Charles Dickens' ),
array ( " The Lord of \n the Rings " , " J. R. \n R. Tolkien " ),
new TableSeparator (),
array ( '80-902734-1-6' , new TableCell ( " And Then \n There \n Were None " , array ( 'rowspan' => 3 )), 'Agatha Christie' ),
array ( '80-902734-1-7' , 'Test' ),
),
'default' ,
<<< TABLE
+---------------+----------------------+-----------------+
| ISBN | Title | Author |
+---------------+----------------------+-----------------+
| 9971 - 5 - 0210 - 0 | Divine Comedy | Dante Alighieri |
| | A Tale of Two Cities | Charles Dickens |
| | The Lord of | J . R . |
| | the Rings | R . Tolkien |
+---------------+----------------------+-----------------+
| 80 - 902734 - 1 - 6 | And Then | Agatha Christie |
| 80 - 902734 - 1 - 7 | There | Test |
| | Were None | |
+---------------+----------------------+-----------------+
TABLE
),
'Cell with rowspan and colspan' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array (
new TableCell ( '9971-5-0210-0' , array ( 'rowspan' => 2 , 'colspan' => 2 )),
'Dante Alighieri' ,
),
array ( 'Charles Dickens' ),
new TableSeparator (),
array (
'Dante Alighieri' ,
new TableCell ( '9971-5-0210-0' , array ( 'rowspan' => 3 , 'colspan' => 2 )),
),
array ( 'J. R. R. Tolkien' ),
array ( 'J. R. R' ),
),
'default' ,
<<< TABLE
+------------------+--------+-----------------+
| ISBN | Title | Author |
+------------------+--------+-----------------+
| 9971 - 5 - 0210 - 0 | Dante Alighieri |
| | Charles Dickens |
+------------------+--------+-----------------+
| Dante Alighieri | 9971 - 5 - 0210 - 0 |
| J . R . R . Tolkien | |
| J . R . R | |
+------------------+--------+-----------------+
TABLE
),
'Cell with rowspan and colspan contains new line break' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array (
new TableCell ( " 9971 \n -5- \n 021 \n 0-0 " , array ( 'rowspan' => 2 , 'colspan' => 2 )),
'Dante Alighieri' ,
),
array ( 'Charles Dickens' ),
new TableSeparator (),
array (
'Dante Alighieri' ,
new TableCell ( " 9971 \n -5- \n 021 \n 0-0 " , array ( 'rowspan' => 2 , 'colspan' => 2 )),
),
array ( 'Charles Dickens' ),
new TableSeparator (),
array (
new TableCell ( " 9971 \n -5- \n 021 \n 0-0 " , array ( 'rowspan' => 2 , 'colspan' => 2 )),
new TableCell ( " Dante \n Alighieri " , array ( 'rowspan' => 2 , 'colspan' => 1 )),
),
),
'default' ,
<<< TABLE
+-----------------+-------+-----------------+
| ISBN | Title | Author |
+-----------------+-------+-----------------+
| 9971 | Dante Alighieri |
| - 5 - | Charles Dickens |
| 021 | |
| 0 - 0 | |
+-----------------+-------+-----------------+
| Dante Alighieri | 9971 |
| Charles Dickens | - 5 - |
| | 021 |
| | 0 - 0 |
+-----------------+-------+-----------------+
| 9971 | Dante |
| - 5 - | Alighieri |
| 021 | |
| 0 - 0 | |
+-----------------+-------+-----------------+
TABLE
),
'Cell with rowspan and colspan without using TableSeparator' => array (
array ( 'ISBN' , 'Title' , 'Author' ),
array (
array (
new TableCell ( " 9971 \n -5- \n 021 \n 0-0 " , array ( 'rowspan' => 2 , 'colspan' => 2 )),
'Dante Alighieri' ,
),
array ( 'Charles Dickens' ),
array (
'Dante Alighieri' ,
new TableCell ( " 9971 \n -5- \n 021 \n 0-0 " , array ( 'rowspan' => 2 , 'colspan' => 2 )),
),
array ( 'Charles Dickens' ),
),
'default' ,
<<< TABLE
+-----------------+-------+-----------------+
| ISBN | Title | Author |
+-----------------+-------+-----------------+
| 9971 | Dante Alighieri |
| - 5 - | Charles Dickens |
| 021 | |
| 0 - 0 | |
| Dante Alighieri | 9971 |
| Charles Dickens | - 5 - |
| | 021 |
| | 0 - 0 |
+-----------------+-------+-----------------+
TABLE
),
'Cell with rowspan and colspan with separator inside a rowspan' => array (
array ( 'ISBN' , 'Author' ),
array (
array (
2015-10-08 11:40:12 -07:00
new TableCell ( '9971-5-0210-0' , array ( 'rowspan' => 3 , 'colspan' => 1 )),
2015-08-17 17:00:26 -07:00
'Dante Alighieri' ,
),
array ( new TableSeparator ()),
array ( 'Charles Dickens' ),
),
'default' ,
<<< TABLE
+---------------+-----------------+
| ISBN | Author |
+---------------+-----------------+
| 9971 - 5 - 0210 - 0 | Dante Alighieri |
| |-----------------|
| | Charles Dickens |
+---------------+-----------------+
TABLE
),
'Multiple header lines' => array (
array (
array ( new TableCell ( 'Main title' , array ( 'colspan' => 3 ))),
array ( 'ISBN' , 'Title' , 'Author' ),
),
array (),
'default' ,
<<< TABLE
+------+-------+--------+
| Main title |
+------+-------+--------+
| ISBN | Title | Author |
+------+-------+--------+
TABLE
),
);
}
public function testRenderMultiByte ()
{
if ( ! function_exists ( 'mb_strlen' )) {
$this -> markTestSkipped ( 'The "mbstring" extension is not available' );
}
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( array ( '■■' ))
-> setRows ( array ( array ( 1234 )))
-> setStyle ( 'default' )
;
$table -> render ();
$expected =
<<< TABLE
+------+
| ■■ |
+------+
| 1234 |
+------+
TABLE ;
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
}
public function testStyle ()
{
$style = new TableStyle ();
$style
-> setHorizontalBorderChar ( '.' )
-> setVerticalBorderChar ( '.' )
-> setCrossingChar ( '.' )
;
Table :: setStyleDefinition ( 'dotfull' , $style );
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( array ( 'Foo' ))
-> setRows ( array ( array ( 'Bar' )))
-> setStyle ( 'dotfull' );
$table -> render ();
$expected =
<<< TABLE
.......
. Foo .
.......
. Bar .
.......
TABLE ;
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
}
public function testRowSeparator ()
{
$table = new Table ( $output = $this -> getOutputStream ());
$table
-> setHeaders ( array ( 'Foo' ))
-> setRows ( array (
array ( 'Bar1' ),
new TableSeparator (),
array ( 'Bar2' ),
new TableSeparator (),
array ( 'Bar3' ),
));
$table -> render ();
$expected =
<<< TABLE
+------+
| Foo |
+------+
| Bar1 |
+------+
| Bar2 |
+------+
| Bar3 |
+------+
TABLE ;
$this -> assertEquals ( $expected , $this -> getOutputContent ( $output ));
2015-08-27 12:03:05 -07:00
$this -> assertEquals ( $table , $table -> addRow ( new TableSeparator ()), 'fluent interface on addRow() with a single TableSeparator() works' );
2015-08-17 17:00:26 -07:00
}
protected function getOutputStream ()
{
return new StreamOutput ( $this -> stream , StreamOutput :: VERBOSITY_NORMAL , false );
}
protected function getOutputContent ( StreamOutput $output )
{
rewind ( $output -> getStream ());
return str_replace ( PHP_EOL , " \n " , stream_get_contents ( $output -> getStream ()));
}
}