/*______________ | ______ | U I Z E J A V A S C R I P T F R A M E W O R K | / / | --------------------------------------------------- | / O / | MODULE : Uize.Test.Uize.Templates.Text.Table Class | / / / | | / / / /| | ONLINE : http://uize.com | /____/ /__/_| | COPYRIGHT : (c)2014 UIZE | /___ | LICENSE : Available under MIT License or GNU General Public License |_______________| http://uize.com/license.html */ /* Module Meta Data type: Test importance: 1 codeCompleteness: 100 docCompleteness: 100 */ /*? Introduction The =Uize.Test.Uize.Templates.Text.Table= module defines basic unit tests for the =Uize.Templates.Text.Table= JavaScript template module. *DEVELOPERS:* `Chris van Rensburg` */ Uize.module ({ name:'Uize.Test.Uize.Templates.Text.Table', builder:function () { 'use strict'; return Uize.Test.resolve ({ title:'Test for Uize.Templates.Text.Table JavaScript Template', test:[ Uize.Test.requiredModulesTest ('Uize.Templates.Text.Table'), Uize.Test.staticMethodsTest ([ ['Uize.Templates.Text.Table.process',[ /*** tests for title ***/ /*** test support for no title ***/ ['A table without a title can be generated by not specifying a title property in the input object', { columns:[{title:'Foo'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '|-----|\n' + '+-----+\n' ], ['A table without a title can be generated by specifying an empty string for the title property in the input object', { title:'', columns:[{title:'Foo'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '|-----|\n' + '+-----+\n' ], ['A table without a title can be generated by specifying the value null for the title property in the input object', { title:null, columns:[{title:'Foo'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '|-----|\n' + '+-----+\n' ], ['A table without a title can be generated by specifying the value undefined for the title property in the input object', { title:undefined, columns:[{title:'Foo'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '|-----|\n' + '+-----+\n' ], ['If the table is wider than the title, then the title text is center-aligned', { title:'The Table Title', columns:[{title:'The Title of a Column'}], rows:[] }, '+-----------------------+\n' + '| The Table Title |\n' + '+-----------------------+\n' + '| The Title of a Column |\n' + '|-----------------------|\n' + '+-----------------------+\n' ], /*** test support for no title ***/ ['A table with a title can be generated by specifying the title as a string for the title property in the input object', { title:'Foo', columns:[{title:'Bar'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '+-----+\n' + '| Bar |\n' + '|-----|\n' + '+-----+\n' ], /*** tests for different numbers of rows ***/ ['A table may contain no rows of data', { title:'Foo', columns:[{title:'Col'}], rows:[] }, '+-----+\n' + '| Foo |\n' + '+-----+\n' + '| Col |\n' + '|-----|\n' + '+-----+\n' ], ['A table may contain a single row of data', { title:'Foo', columns:[{title:'Col'}], rows:[ ['Foo'] ] }, '+-----+\n' + '| Foo |\n' + '+-----+\n' + '| Col |\n' + '|-----|\n' + '| Foo |\n' + '+-----+\n' ], ['A table may contain multiple rows of data', { title:'Foo', columns:[{title:'Col'}], rows:[ ['Foo'], ['Bar'], ['Baz'], ['Qux'] ] }, '+-----+\n' + '| Foo |\n' + '+-----+\n' + '| Col |\n' + '|-----|\n' + '| Foo |\n' + '|-----|\n' + '| Bar |\n' + '|-----|\n' + '| Baz |\n' + '|-----|\n' + '| Qux |\n' + '+-----+\n' ], /*** tests for columns ***/ /*** tests for different numbers of columns ***/ ['A table may contain just a single column', { title:'Foo', columns:[{title:'Col'}], rows:[ ['Foo'], ['Bar'], ['Baz'], ['Qux'] ] }, '+-----+\n' + '| Foo |\n' + '+-----+\n' + '| Col |\n' + '|-----|\n' + '| Foo |\n' + '|-----|\n' + '| Bar |\n' + '|-----|\n' + '| Baz |\n' + '|-----|\n' + '| Qux |\n' + '+-----+\n' ], ['A table may contain just a single column', { title:'Foo', columns:[{title:'Col 1'},{title:'Col 2'},{title:'Col 3'}], rows:[ ['Foo 1','Foo 2','Foo 3'], ['Bar 1','Bar 2','Bar 3'], ['Baz 1','Baz 2','Baz 3'], ['Qux 1','Qux 2','Qux 3'] ] }, '+-----------------------+\n' + '| Foo |\n' + '+-----------------------+\n' + '| Col 1 | Col 2 | Col 3 |\n' + '|-------+-------+-------|\n' + '| Foo 1 | Foo 2 | Foo 3 |\n' + '|-------+-------+-------|\n' + '| Bar 1 | Bar 2 | Bar 3 |\n' + '|-------+-------+-------|\n' + '| Baz 1 | Baz 2 | Baz 3 |\n' + '|-------+-------+-------|\n' + '| Qux 1 | Qux 2 | Qux 3 |\n' + '+-----------------------+\n' ], /*** tests for column titles ***/ ['Column titles are center-aligned', { title:'Foo', columns:[{title:'Col 1'},{title:'Col 2'},{title:'Col 3'}], rows:[ ['Wide Column Value 1','Wide Column Value 2','Wide Column Value 3'] ] }, '+-----------------------------------------------------------------+\n' + '| Foo |\n' + '+-----------------------------------------------------------------+\n' + '| Col 1 | Col 2 | Col 3 |\n' + '|---------------------+---------------------+---------------------|\n' + '| Wide Column Value 1 | Wide Column Value 2 | Wide Column Value 3 |\n' + '+-----------------------------------------------------------------+\n' ], /*** tests for column width calculation ***/ ['When a column title is wider than all the column values, then the column is as wide as the title', { title:'Table', columns:[{title:'A Wide Column Title'}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+---------------------+\n' + '| Table |\n' + '+---------------------+\n' + '| A Wide Column Title |\n' + '|---------------------|\n' + '| foo |\n' + '|---------------------|\n' + '| bar bar bar |\n' + '|---------------------|\n' + '| baz baz |\n' + '|---------------------|\n' + '| qux qux qux qux |\n' + '+---------------------+\n' ], ['When a column title is narrower than all of the column values, then the column is as wide as the widest column value', { title:'Table', columns:[{title:'Column'}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['When a table\'s title is wider than the maximum width of all the columns, then the table is expanded to fit the title and the difference is distributed evenly across the columns', { title:'This is an extremely long title for this table', columns:[{title:'Col 1'},{title:'Col 2'},{title:'Col 3'}], rows:[ ['Foo 1','Foo 2','Foo 3'], ['Bar 1','Bar 2','Bar 3'], ['Baz 1','Baz 2','Baz 3'], ['Qux 1','Qux 2','Qux 3'] ] }, '+------------------------------------------------+\n' + '| This is an extremely long title for this table |\n' + '+------------------------------------------------+\n' + '| Col 1 | Col 2 | Col 3 |\n' + '|---------------+----------------+---------------|\n' + '| Foo 1 | Foo 2 | Foo 3 |\n' + '|---------------+----------------+---------------|\n' + '| Bar 1 | Bar 2 | Bar 3 |\n' + '|---------------+----------------+---------------|\n' + '| Baz 1 | Baz 2 | Baz 3 |\n' + '|---------------+----------------+---------------|\n' + '| Qux 1 | Qux 2 | Qux 3 |\n' + '+------------------------------------------------+\n' ], /*** tests for column alignment ***/ ['Column data is left-aligned, by default, when alignment is not explicitly specified', { title:'Table', columns:[{title:'Column 1'},{title:'Column 2'},{title:'Column 3'}], rows:[ ['foo','bar bar bar','baz baz'], ['bar bar bar','baz baz','qux qux qux qux'], ['baz baz','qux qux qux qux','foo'], ['qux qux qux qux','foo','bar bar bar'] ] }, '+-----------------------------------------------------+\n' + '| Table |\n' + '+-----------------------------------------------------+\n' + '| Column 1 | Column 2 | Column 3 |\n' + '|-----------------+-----------------+-----------------|\n' + '| foo | bar bar bar | baz baz |\n' + '|-----------------+-----------------+-----------------|\n' + '| bar bar bar | baz baz | qux qux qux qux |\n' + '|-----------------+-----------------+-----------------|\n' + '| baz baz | qux qux qux qux | foo |\n' + '|-----------------+-----------------+-----------------|\n' + '| qux qux qux qux | foo | bar bar bar |\n' + '+-----------------------------------------------------+\n' ], ['Column data can be left-aligned, by specifying the value "left" for the align property of the column description', { title:'Table', columns:[{title:'Column',align:'left'}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be left-aligned, by specifying the value 0 for the align property of the column description', { title:'Table', columns:[{title:'Column',align:0}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be center-aligned, by specifying the value "center" for the align property of the column description', { title:'Table', columns:[{title:'Column',align:'center'}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be center-aligned, by specifying the value .5 for the align property of the column description', { title:'Table', columns:[{title:'Column',align:.5}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be right-aligned, by specifying the value "right" for the align property of the column description', { title:'Table', columns:[{title:'Column',align:'right'}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be right-aligned, by specifying the value 1 for the align property of the column description', { title:'Table', columns:[{title:'Column',align:1}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Column data can be quarter-aligned, by specifying the value .25 for the align property of the column description', { title:'Table', columns:[{title:'Column',align:.25}], rows:[ ['foo'], ['bar bar bar'], ['baz baz'], ['qux qux qux qux'] ] }, '+-----------------+\n' + '| Table |\n' + '+-----------------+\n' + '| Column |\n' + '|-----------------|\n' + '| foo |\n' + '|-----------------|\n' + '| bar bar bar |\n' + '|-----------------|\n' + '| baz baz |\n' + '|-----------------|\n' + '| qux qux qux qux |\n' + '+-----------------+\n' ], ['Different columns can have different alignment', { title:'Table', columns:[ {title:'Column 1',align:'left'}, {title:'Column 2',align:'center'}, {title:'Column 3',align:'right'} ], rows:[ ['foo','bar bar bar','baz baz'], ['bar bar bar','baz baz','qux qux qux qux'], ['baz baz','qux qux qux qux','foo'], ['qux qux qux qux','foo','bar bar bar'] ] }, '+-----------------------------------------------------+\n' + '| Table |\n' + '+-----------------------------------------------------+\n' + '| Column 1 | Column 2 | Column 3 |\n' + '|-----------------+-----------------+-----------------|\n' + '| foo | bar bar bar | baz baz |\n' + '|-----------------+-----------------+-----------------|\n' + '| bar bar bar | baz baz | qux qux qux qux |\n' + '|-----------------+-----------------+-----------------|\n' + '| baz baz | qux qux qux qux | foo |\n' + '|-----------------+-----------------+-----------------|\n' + '| qux qux qux qux | foo | bar bar bar |\n' + '+-----------------------------------------------------+\n' ], /*** tests for column formatters ***/ ['A column formatter can be specified for each column', { title:'Table', columns:[ {title:'Description'}, { title:'Price (US Dollars)', align:'right', formatter:function (_value) {return 'US $' + _value.toFixed (2)} }, { title:'Inflation (%)', align:'right', formatter:function (_value) {return _value.toFixed (1) + ' %'} } ], rows:[ ['bread (1 loaf)',1.4,2.1564], ['milk (1 pint)',1.99,3.9041], ['sugar (200g)',2.49,6.8] ] }, '+-----------------------------------------------------+\n' + '| Table |\n' + '+-----------------------------------------------------+\n' + '| Description | Price (US Dollars) | Inflation (%) |\n' + '|----------------+--------------------+---------------|\n' + '| bread (1 loaf) | US $1.40 | 2.2 % |\n' + '|----------------+--------------------+---------------|\n' + '| milk (1 pint) | US $1.99 | 3.9 % |\n' + '|----------------+--------------------+---------------|\n' + '| sugar (200g) | US $2.49 | 6.8 % |\n' + '+-----------------------------------------------------+\n' ], ['A column formatter can be specified in the form of a value transformer expression string', { title:'Price Comparisons', columns:[ {title:'Description'}, { title:'Price (US Dollars)', align:'right', formatter:'"US $" + value.toFixed (2)' }, { title:'Inflation (%)', align:'right', formatter:'value.toFixed (1) + " %"' } ], rows:[ ['bread (1 loaf)',1.4,2.1564], ['milk (1 pint)',1.99,3.9041], ['sugar (200g)',2.49,6.8] ] }, '+-----------------------------------------------------+\n' + '| Price Comparisons |\n' + '+-----------------------------------------------------+\n' + '| Description | Price (US Dollars) | Inflation (%) |\n' + '|----------------+--------------------+---------------|\n' + '| bread (1 loaf) | US $1.40 | 2.2 % |\n' + '|----------------+--------------------+---------------|\n' + '| milk (1 pint) | US $1.99 | 3.9 % |\n' + '|----------------+--------------------+---------------|\n' + '| sugar (200g) | US $2.49 | 6.8 % |\n' + '+-----------------------------------------------------+\n' ], ['A column formatter is called as an instance method on the column description object', { title:'Table', columns:[ { title:'Price', align:'right', currency:'US $', formatter:function (_value) {return this.currency + _value.toFixed (2)} } ], rows:[ [1.4], [1.99], [2.49] ] }, '+----------+\n' + '| Table |\n' + '+----------+\n' + '| Price |\n' + '|----------|\n' + '| US $1.40 |\n' + '|----------|\n' + '| US $1.99 |\n' + '|----------|\n' + '| US $2.49 |\n' + '+----------+\n' ], ['Column width is calculated based on the formatted column data and not the raw, unformatted column data', { title:'Table', columns:[ { title:'Col', formatter:function (_value) {return _value.toFixed (2)} } ], rows:[ [2.34545756785645], [67.3106034049435], [105.10303042] ] }, '+--------+\n' + '| Table |\n' + '+--------+\n' + '| Col |\n' + '|--------|\n' + '| 2.35 |\n' + '|--------|\n' + '| 67.31 |\n' + '|--------|\n' + '| 105.10 |\n' + '+--------+\n' ], /*** tests for column min and max values ***/ /*** test support for explicitly specifying the min and max values ***/ ['When a value is specified for the minValue property in the column description for a column, that value is respected', { title:'Table', columns:[ { title:'Column', minValue:10, formatter:function (_value) {return _value - this.minValue} } ], rows:[ [15], [12], [27] ] }, '+--------+\n' + '| Table |\n' + '+--------+\n' + '| Column |\n' + '|--------|\n' + '| 5 |\n' + '|--------|\n' + '| 2 |\n' + '|--------|\n' + '| 17 |\n' + '+--------+\n' ], ['When a value is specified for the maxValue property in the column description for a column, that value is respected', { title:'Table', columns:[ { title:'Column', maxValue:30, formatter:function (_value) {return this.maxValue - _value} } ], rows:[ [15], [12], [27] ] }, '+--------+\n' + '| Table |\n' + '+--------+\n' + '| Column |\n' + '|--------|\n' + '| 15 |\n' + '|--------|\n' + '| 18 |\n' + '|--------|\n' + '| 3 |\n' + '+--------+\n' ], /*** test support for computing the min and max values ***/ ['When no value is specified for the minValue property in the column description for a column, it is calculated from the column values and set on the column description', { title:'Table', columns:[ { title:'Column', formatter:function (_value) {return _value - this.minValue} } ], rows:[ [15], [12], [27] ] }, '+--------+\n' + '| Table |\n' + '+--------+\n' + '| Column |\n' + '|--------|\n' + '| 3 |\n' + '|--------|\n' + '| 0 |\n' + '|--------|\n' + '| 15 |\n' + '+--------+\n' ], ['When no value is specified for the maxValue property in the column description for a column, it is calculated from the column values and set on the column description', { title:'Table', columns:[ { title:'Column', formatter:function (_value) {return this.maxValue - _value} } ], rows:[ [15], [12], [27] ] }, '+--------+\n' + '| Table |\n' + '+--------+\n' + '| Column |\n' + '|--------|\n' + '| 12 |\n' + '|--------|\n' + '| 15 |\n' + '|--------|\n' + '| 0 |\n' + '+--------+\n' ] ]] ]) ] }); } });