如何为数据集描述创建spock风格的DSL?
作者:互联网
我想在spock数据驱动的规范格式中有一个数据集描述:
'Key' | 'Value' | 'Comments'
1 | 'foo' | 'something'
2 | 'bar' | 'something else'
这必须转换为像2D数组(或任何可能实现的).
有任何想法如何实现这种数据描述?
附:最大的问题是换行检测,其余的可以通过重载或在Object的metaClass上实现.
解决方法:
| operator是左关联的,因此该表中的一行将被解析为:
('Key' | 'Value') | 'Comments'
然后你可以做什么来检测每行开始和结束的位置是使opeator返回一个包含其操作数的列表,然后返回每个|询问左侧操作数(即此)是否为列表.如果是,则意味着它是一行的延续;如果它不是列表,则意味着它是一个新行.
以下是使用Category解析这些数据集的DSL的完整示例,以避免覆盖Object元类的内容:
@Category(Object)
class DatasetCategory {
// A static property for holding the results of the DSL.
static results
def or(other) {
if (this instanceof List) {
// Already in a row. Add the value to the row.
return this << other
} else {
// A new row.
def row = [this, other]
results << row
return row
}
}
}
// This is the method that receives a closure with the DSL and returns the
// parsed result.
def dataset(Closure cl) {
// Initialize results and execute closure using the DatasetCategory.
DatasetCategory.results = []
use (DatasetCategory) { cl() }
// Convert the 2D results array into a list of objects:
def table = DatasetCategory.results
def header = table.head()
def rows = table.tail()
rows.collect { row ->
[header, row].transpose().collectEntries { it }
}
}
// Example usage.
def data = dataset {
'Key' | 'Value' | 'Comments'
1 | 'foo' | 'something'
2 | 'bar' | 'something else'
}
// Correcness test :)
assert data == [
[Key: 1, Value: 'foo', Comments: 'something'],
[Key: 2, Value: 'bar', Comments: 'something else']
]
在这个例子中,我将表解析为一个映射列表,但是在DSL闭包运行之后,您应该可以使用DatasetCategory的结果执行任何操作.
标签:java,groovy,spock 来源: https://codeday.me/bug/20190620/1246298.html