/*______________
| ______ | 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'
]
]]
])
]
});
}
});