我有一个为烟雾测试程序编写的DSL。在程序运行结束时,另一个程序选择它并生成PDF报告。 (选择DSL主要是为了在不同格式之间切换)
在标题页之后,将显示测试套件的结果摘要。所以,我在那里放了一个占位符。
add table:summary header="Summary" columns: 2
然后,在每个测试用例结束时,我向该表插入一行,如下所示:
add row table:summary values: "Entitlements Test, PASS"
由于表声明和行是分散的,我想在DSL解析器运行之前将它们全部分组,DSL解析器立即对每一行执行操作。
是否有更好的方法可以将行与表以及程序写入的顺序(时间)进行分组。
我已经打破了我的头脑超过两天但是没有比这些蹩脚的想法更好的方法:
(如果我想在报告中引入更多表格,我所有的解决方案都很糟糕)
将文件作为字符串列表加载到内存中。将指针放在第一个表索引上,进一步循环(通过整个列表)并在表声明的下一个索引中插入行按下列表的其余部分 - 每行0(n):-(在整个列表之后)已遍历,搜索下一个表指针并重复该过程。如果列表已到达终点而没有点击另一个表,我们就完成了。我猜一个平衡树比这里的列表更好。
< / LI>在“add table”之前加上一个前缀,说“t1”,行为“t1r1”,“t1r2”,然后在解析器运行之前对DSL进行预处理。
选择以“add table”和“add row”开头的所有行,将其存储在有序列表中。对于每个表,过滤表的相关行并执行固定的订单比较。 https://discursive.atlassian.net/wiki/display/CJCOOK/Fixed+Order+Comparison(我还没看到内部有什么作用)。
整个文件最多不会运行超过几千行,报告过程本身就是一个专门的过程。因此,空间不应成为约束。
整个DSL都是这样的:
add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add title : "Login page"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
...
...
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
...
...
add row table:summary values: "Entitlements Test, Pass"
...
...
add row table:summary values: "Another Test, Pass"
...
...
add row table:summary values: "Yet Another Test, Fail"
...
(由于该程序尚未向任何人展示,我可以按照我想要的方式自由更改DSL。但是,如果我们能够使DSL尽可能具有人类可读性,那将会非常棒。)
答案 0 :(得分:1)
我不确定我是否正确理解了您的要求,但我想出了这个简单的概念验证,这对我来说似乎相当快。请注意,它不是用Java编写的:(
awk '/^add row table:/{printf "%06d|%s\n", hash[$3], $0; next}
/^add table:/{hash[$2]=NR}
{printf "%06d|%s\n", NR, $0}' data |
sort -sn |
cut -f2 -d'|'
“算法”很简单:保持表名到行号的哈希表。每次看到新的表定义时,都会将当前行号插入到哈希表中。对于add row
行以外的每一行,输出行号作为行的前缀;对于add row
行,查看哈希表中的表名并使用该名称而不是行号。然后使用稳定的排序对输出进行排序。 [注1和2]
我用这个数据文件测试了它,它有两个表:
add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add title : "Login page"
add table:other header="Other" columns: 1
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
... 1
... 2
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
... 3
add row table:other values: "Other 1"
... 4
add row table:summary values: "Entitlements Test, Pass"
... 5
... 6
add row table:other values: "Other before 2"
add row table:other values: "Other 2"
add row table:other values: "Other after 2"
... 6a
add row table:summary values: "Another Test, Pass"
... 7
... 8
add row table:summary values: "Yet Another Test, Fail"
它产生了:
add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add row table:summary values: "Entitlements Test, Pass"
add row table:summary values: "Another Test, Pass"
add row table:summary values: "Yet Another Test, Fail"
add title : "Login page"
add table:other header="Other" columns: 1
add row table:other values: "Other 1"
add row table:other values: "Other before 2"
add row table:other values: "Other 2"
add row table:other values: "Other after 2"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
... 1
... 2
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
... 3
... 4
... 5
... 6
... 6a
... 7
... 8
注1:当遇到添加行时,最好检查以确保表名存在。
注意2:可以同时保留哈希表中的行号和add row
行数,每次看到新行时都更新计数,在这种情况下你不会我不得不担心稳定的排序,虽然我不认为找到稳定的排序是一个问题,所以我要避免复杂化。
答案 1 :(得分:0)
最后,我猜我用O(n)空间方法找到了一种O(n)方法
创建一个空列表来保存已排序的值(sortedList)和一个空映射来存储表声明的位置
1) Loop through each line of the file
2) If the line of the file is a table declaration, populate it into a tableMap with key as tablename and value as line number
2a) Add the line to the sorted list
3) If the line of the file is a row declaration, take the line number of the table (in the tableMap) and insert the row line in the next index (in the sorted list)
3a) Increment the line number value for the table in the tableMap
4) If this is any other line, just add it to the sorted list