Revision: 5195
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at February 18, 2008 04:15 by roock
Initial Code
class Table {
def colNames = []
def rowNames = []
def cells = [:]
def topLeft = ''
def addCol(colName) {
if (!(colName in colNames)) colNames << colName
}
def addRow(rowName) {
if (!(rowName in rowNames)) rowNames << rowName
}
def get(rowName, colName) {
cells.get( computeKey(rowName, colName) )
}
def put(rowName, colName, value) {
if (!(rowName in rowNames)) rowNames << rowName
if (!(colName in colNames)) colNames << colName
def endValue = value
if (value instanceof Closure) {
endValue = value.call(get(rowName, colName))
}
cells.put(computeKey(rowName, colName), endValue)
}
def fill(value) {
rowNames.each{rowName ->
colNames.each{colName -> put(rowName, colName, value)}
}
}
def fillIfNull(value) {
rowNames.each{rowName ->
colNames.each{colName -> put(rowName, colName){ it ?: value } }
}
}
def getRowCount() {
rowNames.size()
}
def getColCount() {
colNames.size()
}
def toListOfLists(withRowNames=true, withColNames=true) {
def result = withColNames ? [[topLeft, *colNames]] : []
rowNames.each{rowName ->
def row = withRowNames ? [rowName] : []
colNames.each{colName ->
row << get(rowName, colName)
}
result << row
}
result
}
def each(Closure closure) {
rowNames.each{rowName ->
colNames.each{colName ->
closure.call(rowName, colName, get(rowName, colName))
}
}
}
private computeKey(rowName, colName) {
[rowName, colName]
}
}
class TableTests extends GroovyTestCase {
def table = new Table(colNames: ['c1', 'c2'], rowNames: ['r1', 'r2'])
void testHasNullAsDefaultCellValue() {
assertNull table.get('r1', 'c1')
}
void testCountsRows() {
assertEquals 2, table.rowCount
}
void testCountsColumns() {
assertEquals 2, table.colCount
}
void testAddsRow() {
table.addRow('r3')
assertEquals 3, table.rowCount
}
void testAddsColumn() {
table.addCol('c3')
assertEquals 3, table.colCount
}
void testHasUniqueColumnNames() {
table.addCol('c1')
assertEquals(['c1', 'c2'], table.colNames)
}
void testHasUniqueRowNames() {
table.addRow('r1')
assertEquals(['r1', 'r2'], table.rowNames)
}
void testAddsColumnOnDemand() {
table.put('r1', 'c3', '')
assertEquals(['c1', 'c2', 'c3'], table.colNames)
}
void testAddsRowOnDemand() {
table.put('r3', 'c1', '')
assertEquals(['r1', 'r2', 'r3'], table.rowNames)
}
void testHasNullDefaultValueInCells() {
assertNull table.get('r1', 'c1')
}
void testPutsValueInCell() {
table.put('r1', 'c1', 'value')
assertEquals 'value', table.get('r1', 'c1')
}
void testPutsClosureResultInCell() {
table.put('r1', 'c1', 'value')
table.put('r1', 'c1'){ it + '2'}
assertEquals 'value2', table.get('r1', 'c1')
}
void testFillsCells() {
table.fill(1)
assertEquals( [[1, 1], [1, 1]], table.toListOfLists(false, false) )
}
void testFillsNullCells() {
table.put('r1', 'c1', 2)
table.fillIfNull(1)
assertEquals( [[2, 1], [1, 1]], table.toListOfLists(false, false) )
}
void testConvertsContentToListOfLists() {
table.put('r1', 'c1', 'r1c1')
table.put('r1', 'c2', 'r1c2')
table.put('r2', 'c1', 'r2c1')
table.put('r2', 'c2', 'r2c2')
table.topLeft = 'x'
assertEquals( [['x', 'c1', 'c2'], ['r1', 'r1c1', 'r1c2'], ['r2', 'r2c1', 'r2c2']], table.toListOfLists() )
}
void testIteratesOverCells() {
table.fill(1)
def result = []
table.each{rowName, colName, value -> result << [rowName, colName, value]}
assertEquals( [['r1', 'c1', 1], ['r1', 'c2', 1], ['r2', 'c1', 1], ['r2', 'c2', 1]], result)
}
}
Initial URL
Initial Description
Table as a MAP with 2D keys (row and column).
Initial Title
Table Collection
Initial Tags
table
Initial Language
Groovy