lamed_table
Version:
Light table implementation
332 lines (280 loc) • 11.2 kB
JavaScript
// 'use strict' // Comment out in test functions
console.log(`Starting ${__filename}...`) // comment line to remove simple logging
/* ------------------------------------------------------
* table.test.js
* Purpose: The purpose of this module is to test table operations
* Date Created: 2019/12/11
* Created by : Perez Lamed van Niekerk
--------------------------------------------------------- */
/* jshint esversion: 6 */
const _test = require('lamed_test')
const { Ok, notOk, notOk_Then, Equal, notEqual, con, testAND, unZip } = _test // eslint-disable-line
con.useChalk(require('chalk'))
// con.traceSet(0)
const _table = require('../src/table') // eslint-disable-line
const _lio = require('lamed_io')
const _lfolder = require('lamed_folder')
function tableTest1 (done) {
con.traceLine()
con.trace(module.filename)
con.traceBold(`--------------------------> ${arguments.callee.name}()`) // eslint-disable-line
let error = `In ${module.filename} --> ${arguments.callee.name}()\n` // eslint-disable-line
// if (false) return done(new Error(error))
const myTable = new _table.TableDef(['Branch', 'Commit'])
unZip(() => myTable.totalCols(), 2)
unZip(() => { return myTable.DATA }, { name: 'tableName', cols: ['branch', 'commit'], rows: [] })
myTable.Rows.Add(['branch1234', 'commit1234'])
myTable.Rows.Add(['branch123', 'commit123'])
myTable.sort('branch')
if (notEqual(myTable.DATA.rows, [
['branch123', 'commit123'],
['branch1234', 'commit1234']
])) return done(new Error(error))
const row = []
myTable.Rows.Set(row, 'coMMiT', 'commit4321') // Should work for different cases (not case sensitive)
myTable.Rows.Set(row, 'Branch', 'brr123')
myTable.Rows.Add(row)
if (notEqual(myTable.DATA.rows, [
['branch123', 'commit123'],
['branch1234', 'commit1234'],
['brr123', 'commit4321']
])) return done(new Error(error))
// Find
const table1 = myTable.find('commit', 'commit4321')
const table2 = myTable.find('coMMit', 'commit4321')
if (notEqual(table1, table2)) return done(new Error(error))
if (notEqual(table1.DATA.rows, [
['brr123', 'commit4321']
])) return done(new Error(error))
if (notEqual(myTable.Rows.Include('COMMIT', '123'), myTable.Rows.Include('commit', '123'))) return done(new Error(error))
const rows1 = myTable.Rows.Include('commit', '123', true)
const rows2 = myTable.Rows.Include('commit', '123', false)
if (notEqual(rows1, ['branch123', 'commit123'])) return done(new Error(error))
if (notEqual(rows2, [
['branch123', 'commit123'],
['branch1234', 'commit1234']
])) return done(new Error(error))
const mdOutput = '## Table Name\n\n| Branch |Commit |\n| ---- | ---- |\nbranch123 |commit123 |\nbranch1234 |commit1234 |\nbrr123 |commit4321 |\n'
const md = myTable.toMD()
if (notEqual(md, mdOutput)) {
myTable.check(true)
con.trace({
md,
mdOutput
})
return done(new Error(error))
}
// colsNumber
if (myTable.Cols.Number('Branch') !== 0) return done(new Error(error))
if (myTable.Cols.Number('Commit') !== 1) return done(new Error(error))
if (myTable.Cols.Number('COMMIT') !== 1) return done(new Error(error))
if (myTable.Cols.Number('Branch1', false) !== -1) return done(new Error(error))
if (myTable.Cols.Number(0) !== 0) return done(new Error(error))
if (myTable.Cols.Number(1) !== 1) return done(new Error(error))
if (myTable.Cols.Number(10, false) !== -1) return done(new Error(error))
if (myTable.Cols.Number(-5, false) !== -1) return done(new Error(error))
// Test generated code
const tableRowCode = myTable.CodeGenerate.RowGet(false)
const rowResult = ' let [ branch, commit ] = row\n con.log({ branch, commit })\n'
if (notEqual(rowResult, tableRowCode)) {
con.log({
rowResult,
tableRowCode
})
return done(new Error(error))
}
unZip(() => myTable.CodeGenerate.RowSet(false),
"// Table [tableName] -> ['branch',commit']\n" +
'let row = []\n' +
"tableName.Rows.Set(row, 'branch', '???')\n" +
"tableName.Rows.Set(row, 'commit', '???')\n" +
'tableName.Rows.Add(row)\n'
)
unZip(() => myTable.CodeGenerate.RowAdd(false), 'tableName.Rows.Add([branch, commit])')
const tableLoopCode = myTable.CodeGenerate.TableLoop(false)
const loopResult = '// tableName -> [branch, commit]\n for (let ii = 0; ii < tableName.DATA.rows.length; ii++) {\n let row = tableName.DATA.rows[ii]\n let [ branch, commit ] = row\n con.log({ branch, commit })\n}'
if (notEqual(loopResult, tableLoopCode)) {
con.log({
loopResult,
tableLoopCode
})
return done(new Error(error))
}
return true // success
}
function colsAddTest1 (done) {
let error = con.traceFunction(arguments.callee.name) // eslint-disable-line
// if (false) done(new Error(error))
const myTable = new _table.TableDef(['Branch', 'Commit'])
myTable.Rows.Add(['branch123', 'commit123'])
myTable.Rows.Add(['branch1234', 'commit1234'])
const cols1 = ['branch', 'commit', 'id']
// -----------------------------------------------[ colsAdd]
myTable.Cols.Add('Id', '5')
if (notEqual(myTable.DATA.cols, cols1)) {
myTable.check(true)
return done(new Error(error))
}
const cols2 = ['branch', 'commit', 'id', 'text1', 'text2']
const rows2 = [
['branch123', 'commit123', '5', '', ''],
['branch1234', 'commit1234', '5', '', '']
]
myTable.Cols.Add(['Text1', 'Text2'])
if (notEqual(myTable.DATA.cols, cols2)) {
myTable.check(true)
return done(new Error(error))
}
if (notEqual(myTable.DATA.rows, rows2)) {
myTable.check(true)
return done(new Error(error))
}
const cols3 = ['branch', 'id', 'new']
const rows3 = [
['branch123', '5', ''],
['branch1234', '5', '']
]
const clone = myTable.clone(cols3)
if (notEqual(clone.DATA.cols, cols3)) {
clone.check(true)
return done(new Error(error))
}
if (notEqual(clone.DATA.rows, rows3)) {
clone.check(true)
return done(new Error(error))
}
// -----------------------------------------------
return true // success
}
function createTestTable (show) {
let error = con.traceFunction(arguments.callee.name) // eslint-disable-line
const result = new _table.TableDef(['id', 'name', 'age', 'cost', 'description', 'fk'], 'result')
// result.CodeGenerate.RowSet()
// unZip(() => result.CodeGenerate.RowAdd(false), 'result.Rows.Add([id, name, age, cost, description, fk])')
result.Rows.Add([1, 'pa', 50, 200.10, 'person', 'test'])
result.Rows.Add([2, 'Sannie', 30, 100.10, 'women', 'test'])
result.Rows.Add([3, 'Piet', 40, 1500.10, 'man', 'test'])
result.Rows.Add([4, 'Cobus', 50, 200.10, 'dad', 'test'])
result.Rows.Add([4, 'Cobus', 50, 200.10, 'dad', 'test'])
result.Rows.Add([4, 'Cobus', 65, 200.10, 'dad', 'test'])
result.Rows.Add([4, 'Cobus', 70, 200.10, 'pa', 'test'])
result.show()
// Statistics
result.stats(show)
const html = result.toHTML()
const file1 = _lfolder.rootFolder() + 'test/table1.html'
_lio.writeFileSync(file1, html)
// Find
const search = result.find('name', 'cobus')
search.show(show)
const filter = result.filterNew()
filter.add('name', 'cobus', '=')
filter.add('description', 'pa')
let search2 = result.filter(filter)
search2.show(show)
filter.add('description', 'women', '=', false)
filter.show(show)
search2 = result.filter(filter)
search2.show(show)
result.show(show)
result.check()
const filter2 = result.filterNew()
filter2.add('age', 60, '>')
// con.log({ result })
const search3 = result.filter(filter2)
search3.show(show)
filter2.show(show)
filter2.reset()
return true
}
createTestTable(true)
function appendTableTest (show) {
// Input data
const names = ['piet', 'koos', 'jan', 'antie']
const surnames = ['verdriet', 'kombuis', 'taks', 'jacoba']
const medals1 = ['gold', 'silver']
const medals2 = ['bonze', 'wood']
// Define columns table
con.traceGreen('Define new table and add names to all columns')
const tableNameCols = new _table.TableDef(['name1', 'name2'], 'tableNameCols')
tableNameCols.array2Cols(names)
tableNameCols.show(show)
// Define name table
con.traceGreen('Define new table and add names')
const tableName = new _table.TableDef(['id', 'name'], 'dtTable', 'tableName')
tableName.arrayAppend(names) // Add names
tableName.show(show)
con.traceGreen('Add surnames')
tableName.array2Col(surnames, 'surname') // Add surnames
tableName.show(show)
con.traceGreen('Sort on name')
tableName.sort('name') // Sort the table
tableName.show(show)
// Define join table
con.traceGreen('Define join table')
const tableMedals = new _table.TableDef(['id', 'medal'])
tableMedals.arrayAppend(medals1, 1)
tableMedals.arrayAppend(medals2, 2)
tableMedals.arrayAppend(medals2, 3)
tableMedals.arrayAppend(medals1, 4)
tableMedals.show(show)
// Do the join
con.traceGreen('Do the join')
const dtJoin = tableMedals.join('id', tableName, 'id')
dtJoin.show(show)
// Remove the id column
con.traceGreen('Remove "id" column')
dtJoin.Cols.Drop('id')
dtJoin.show(show)
con.traceGreen('Merge name & surname')
dtJoin.Cols.Merge('Full_name', 'name', 'surname', (x, y) => {
return `${x} ${y}`
})
dtJoin.show(show)
const cols = dtJoin.DATA.cols
// con.log({ cols })
dtJoin.Cols.Drop(cols.length - 1)
dtJoin.show(show)
// con.log({ cols })
return true
}
/**
* Test all functions
* @param done - callback function to indicate failure or completion
* @constructor
*/
function TestAll (done) {
con.traceLine()
con.trace(module.filename)
con.traceBold(`--------------------------> ${arguments.callee.name}()`) // eslint-disable-line
const result0 = tableTest1(done)
const result1 = colsAddTest1(done)
const result2 = createTestTable(!_test.isRootFolder())
const result3 = appendTableTest(!_test.isRootFolder())
con.logGreen('Success!!!')
return testAND(module.filename, result0, result1, result2, result3)
}
/**
* Execute the tests manually
*/
function testRunner (traceLevel = 0) {
const done2 = (err) => { if (err !== undefined) { throw err } }
// let isRoot = require('lamed_core').isRootFolder()
const isRoot = _test.isRootFolder()
if (isRoot) return // Only run if not executed from the root folder
// Only run if not executed from the root folder
// Limit lines reported as not tested
con.traceSet(traceLevel); TestAll(done2)
// -------------------------------------------
// Code to generate 'readme' and 'help' when run directly by node
//
// Add to bottom of testRunner()
// Generating readme & help
// npm uninstall -g lamed_readme
// npm i -g lamed_readme
// npm link lamed_readme
// const _gen = require('lamed_readme'); _gen.genReadme(__dirname); _gen.genHelp(__dirname) // Generate readme & help
}
testRunner(0)
// Exports --------------------------
module.exports = { TestAll }