blob: 8b0c7059c3bd836b216e9f88a905c479128e0125 [file] [log] [blame] [view]
@PLUGIN@ States
===============
Below are sample config files which illustrate many examples of how task
states are affected by their own criteria and their subtasks' states.
`task.config` file in project `All-Project` on ref `refs/meta/config`.
```
[root "Root N/A"]
applicable = is:closed # Assumes test query is "is:open"
[root "Root APPLICABLE"]
applicable = is:open # Assumes test query is "is:open"
pass = True
subtask = Subtask APPLICABLE
[root "Root PASS"]
pass = True
[root "Root FAIL"]
fail = True
[root "Root straight PASS"]
applicable = is:open
pass = is:open
[root "Root straight FAIL"]
applicable = is:open
fail = is:open
pass = is:open
[root "Root PASS-fail"]
applicable = is:open
fail = NOT is:open
[root "Root pass-FAIL"]
applicable = is:open
fail = is:open
[root "Root PASS-waiting-fail"]
applicable = is:open
fail = NOT is:open
subtask = Subtask PASS
[root "Root pass-WAITING-fail"]
applicable = is:open
fail = NOT is:open
subtask = Subtask FAIL
[root "Root pass-waiting-FAIL"]
applicable = is:open
fail = is:open
subtask = Subtask PASS
[root "Root grouping PASS (subtask PASS)"]
subtask = Subtask PASS
[root "Root grouping WAITING (subtask READY)"]
subtask = Subtask READY
[root "Root grouping WAITING (subtask FAIL)"]
subtask = Subtask FAIL
[root "Root grouping NA (subtask NA)"]
applicable = is:open # Assumes Subtask NA has "applicable = NOT is:open"
subtask = Subtask NA
[root "Root READY (subtask PASS)"]
applicable = is:open
pass = NOT is:open
subtask = Subtask PASS
ready-hint = You must now run the ready task
[root "Root WAITING (subtask READY)"]
applicable = is:open
pass = is:open
subtask = Subtask READY
[root "Root WAITING (subtask FAIL)"]
applicable = is:open
pass = is:open
subtask = Subtask FAIL
[root "Root IN PROGRESS"]
applicable = is:open
in-progress = is:open
pass = NOT is:open
[root "Root NOT IN PROGRESS"]
applicable = is:open
in-progress = NOT is:open
pass = NOT is:open
[root "Root Optional subtasks"]
subtask = OPTIONAL MISSING |
subtask = Subtask Optional |
[root "Subtasks File"]
subtasks-file = common.config
[root "Subtasks File (Missing)"]
subtasks-file = common.config
subtasks-file = missing
[root "Subtasks External"]
subtasks-external = user special
[root "Subtasks External (Missing)"]
subtasks-external = user special
subtasks-external = missing
[root "Subtasks External (User Missing)"]
subtasks-external = user special
subtasks-external = user missing
[root "Subtasks External (File Missing)"]
subtasks-external = user special
subtasks-external = file missing
[root "Root tasks-factory"]
subtasks-factory = tasks-factory static
subtasks-factory = tasks-factory change
[root "Root tasks-factory static (empty name)"]
subtasks-factory = tasks-factory static (empty name)
# Grouping task since it has no pass criteria, not output since it has no subtasks
[root "Root tasks-factory static (empty name PASS)"]
pass = True
subtasks-factory = tasks-factory static (empty name)
[root "Root Properties"]
set-root-property = root-value
export-root = ${_name}
fail = True
fail-hint = Name(${_name}) Change Number(${_change_number}) Change Id(${_change_id}) Change Project(${_change_project}) Change Branch(${_change_branch}) Change Status(${_change_status}) Change Topic(${_change_topic})
subtask = Subtask Properties
[root "Root Preload"]
preload-task = Subtask FAIL
subtask = Subtask Preload
[root "Root INVALID Preload"]
preload-task = missing
[root "INVALIDS"]
subtasks-file = invalids.config
[root "Root NA Pass"]
applicable = NOT is:open # Assumes test query is "is:open"
pass = True
[root "Root NA Fail"]
applicable = NOT is:open # Assumes test query is "is:open"
fail = True
[root "NA INVALIDS"]
applicable = NOT is:open # Assumes test query is "is:open"
subtasks-file = invalids.config
[tasks-factory "tasks-factory static"]
names-factory = names-factory static list
fail = True
[tasks-factory "tasks-factory static (empty name)"]
names-factory = names-factory static (empty name list)
fail = True
[tasks-factory "tasks-factory change"]
names-factory = names-factory change list
fail = True
[task "Subtask APPLICABLE"]
applicable = is:open
pass = True
[task "Subtask FAIL"]
applicable = is:open
fail = is:open
pass = is:open
[task "Subtask READY"]
applicable = is:open
pass = NOT is:open
subtask = Subtask PASS
[task "Subtask PASS"]
applicable = is:open
pass = is:open
[task "Subtask Optional"]
subtask = Subtask PASS |
subtask = OPTIONAL MISSING | Subtask FAIL
subtask = OPTIONAL MISSING | OPTIONAL MISSING |
subtask = OPTIONAL MISSING | OPTIONAL MISSING | Subtask READY
[task "Subtask NA"]
applicable = NOT is:open # Assumes test query is "is:open"
[task "Subtask Properties"]
export-subtask = ${_name}
subtask = Subtask Properties Hints
subtask = Chained ${_name}
subtask = Subtask Properties Reset
subtasks-factory = TaskFactory Properties Hints
[task "Subtask Properties Hints"]
set-first-property = first-value
set-second-property = ${first-property} second-extra ${third-property}
set-third-property = third-value
fail = True
fail-hint = Name(${_name}) root-property(${root-property}) first-property(${first-property}) second-property(${second-property}) root(${root})
[task "Chained Subtask Properties"]
pass = True
[task "Subtask Properties Reset"]
pass = True
set-first-property = reset-first-value
fail-hint = first-property(${first-property})
[tasks-factory "TaskFactory Properties Hints"]
names-factory = NamesFactory Properties
fail-hint = Name(${_name}) Change Number(${_change_number}) Change Id(${_change_id}) Change Project(${_change_project}) Change Branch(${_change_branch}) Change Status(${_change_status}) Change Topic(${_change_topic})
fail = True
[names-factory "NamesFactory Properties"]
type = change
changes = change:_change1_number OR change:${_change_number} project:${_change_project} branch:${_change_branch}
[task "Subtask Preload"]
preload-task = Subtask READY
subtask = Subtask Preload Preload
subtask = Subtask Preload Hints PASS
subtask = Subtask Preload Hints FAIL
subtask = Subtask Preload Override Pass
subtask = Subtask Preload Override Fail
subtask = Subtask Preload Extend Subtasks
subtask = Subtask Preload Optional
subtask = Subtask Preload Properties
[task "Subtask Preload Preload"]
preload-task = Subtask Preload with Preload
[task "Subtask Preload with Preload"]
preload-task = Subtask PASS
[task "Subtask Preload Hints PASS"]
preload-task = Subtask Hints
pass = False
[task "Subtask Preload Hints FAIL"]
preload-task = Subtask Hints
fail = True
[task "Subtask Preload Override Pass"]
preload-task = Subtask PASS
pass = False
[task "Subtask Preload Override Fail"]
preload-task = Subtask FAIL
fail = False
[task "Subtask Preload Extend Subtasks"]
preload-task = Subtask READY
subtask = Subtask APPLICABLE
[task "Subtask Preload Optional"]
preload-task = Missing | Subtask PASS
[task "Subtask Preload Properties"]
preload-task = Subtask Properties Hints
set-fourth-property = fourth-value
fail-hint = second-property(${second-property}) fourth-property(${fourth-property})
[task "Subtask Hints"] # meant to be preloaded, not a test case in itself
ready-hint = Task is ready
fail-hint = Task failed
[external "user special"]
user = testuser
file = special.config
[external "user missing"]
user = missing
file = special.config
[external "file missing"]
user = testuser
file = missing
[names-factory "names-factory static list"]
name = my a task
name = my b task
name = my c task
name = my d task Change Number(${_change_number}) Change Id(${_change_id}) Change Project(${_change_project}) Change Branch(${_change_branch}) Change Status(${_change_status}) Change Topic(${_change_topic})
type = static
[names-factory "names-factory static (empty name list)"]
type = static
[names-factory "names-factory change list"]
changes = change:_change1_number OR change:_change2_number
type = change
```
`task/common.config` file in project `All-Projects` on ref `refs/meta/config`.
```
[task "file task/common.config PASS"]
applicable = is:open
pass = is:open
[task "file task/common.config FAIL"]
applicable = is:open
fail = is:open
```
`task/invalids.config` file in project `All-Projects` on ref `refs/meta/config`.
```
[task "No PASS criteria"]
fail-hint = Invalid without Pass criteria and without subtasks
[task "WAITING (subtask INVALID)"]
pass = is:open
subtask = Subtask INVALID
[task "WAITING (subtask duplicate)"]
subtask = Subtask INVALID
subtask = Subtask INVALID
[task "WAITING (subtask missing)"]
pass = is:open
subtask = MISSING # security bug: subtask name appears in output
[task "Grouping WAITING (subtask INVALID)"]
subtask = Subtask INVALID
[task "Grouping WAITING (subtask missing)"]
subtask = MISSING # security bug: subtask name appears in output
[task "Subtask INVALID"]
fail-hint = Use when an INVALID subtask is needed, not meant as a test case in itself
[task "Subtask Optional"]
subtask = MISSING | MISSING
[task "NA Bad PASS query"]
applicable = NOT is:open # Assumes test query is "is:open"
fail = True
pass = has:bad
[task "NA Bad FAIL query"]
applicable = NOT is:open # Assumes test query is "is:open"
pass = True
fail = has:bad
[task "NA Bad INPROGRESS query"]
applicable = NOT is:open # Assumes test query is "is:open"
fail = True
in-progress = has:bad
[task "Looping"]
subtask = Looping
[task "Looping Properties"]
set-A = ${B}
set-B = ${A}
fail = True
[task "task (tasks-factory missing)"]
subtasks-factory = missing
[task "task (names-factory type missing)"]
subtasks-factory = tasks-factory (names-factory type missing)
[task "task (names-factory type INVALID)"]
subtasks-factory = tasks-factory (names-factory type INVALID)
[task "task (names-factory duplicate)"]
subtasks-factory = tasks-factory (names-factory duplicate)
[task "task (names-factory changes type missing)"]
subtasks-factory = tasks-factory change (names-factory type missing)
[task "task (names-factory changes missing)"]
subtasks-factory = tasks-factory change (names-factory changes missing)
[task "task (names-factory changes invalid)"]
subtasks-factory = tasks-factory change (names-factory changes invalid)
[task "task (tasks-factory changes loop)"]
subtasks-factory = tasks-factory change loop
[tasks-factory "tasks-factory (names-factory type missing)"]
names-factory = names-factory (type missing)
fail = True
[tasks-factory "tasks-factory (names-factory type INVALID)"]
names-factory = name-factory (type INVALID)
[tasks-factory "tasks-factory (names-factory duplicate)"]
names-factory = names-factory duplicate
fail = True
[tasks-factory "tasks-factory change (names-factory type missing)"]
names-factory = names-factory change list (type missing)
fail = True
[tasks-factory "tasks-factory change (names-factory changes missing)"]
names-factory = names-factory change list (changes missing)
fail = True
[tasks-factory "tasks-factory change (names-factory changes invalid)"]
names-factory = names-factory change list (changes invalid)
fail = True
[tasks-factory "tasks-factory change loop"]
names-factory = names-factory change constant
subtask = task (tasks-factory changes loop)
fail = true
[names-factory "names-factory (type missing)"]
name = no type test
[names-factory "names-factory change list (type missing)"]
changes = change:_change1_number OR change:_change2_number
[names-factory "names-factory (type INVALID)"]
name = invalid type test
type = invalid
[names-factory "names-factory duplicate"]
name = duplicate
name = duplicate
type = static
[names-factory "names-factory change list (changes missing)"]
type = change
[names-factory "names-factory change list (changes invalid)"]
change = change:invalidChange
type = change
[names-factory "names-factory change constant"]
changes = change:_change1_number OR change:_change2_number
type = change
```
`task/special.config` file in project `All-Users` on ref `refs/users/self`.
```
[task "userfile task/special.config PASS"]
applicable = is:open
pass = is:open
[task "userfile task/special.config FAIL"]
applicable = is:open
fail = is:open
```
The expected output for the above task config looks like:
```
$ ssh -x -p 29418 review-example gerrit query is:open \
--task--applicable --format json|head -1 |json_pp
{
...,
"plugins" : [
{
"name" : "task",
"roots" : [
{
"hasPass" : true,
"name" : "Root APPLICABLE",
"status" : "PASS",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask APPLICABLE",
"status" : "PASS"
}
]
},
{
"hasPass" : true,
"name" : "Root PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Root FAIL",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Root straight PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Root straight FAIL",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Root PASS-fail",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Root pass-FAIL",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Root PASS-waiting-fail",
"status" : "PASS",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
},
{
"hasPass" : true,
"name" : "Root pass-WAITING-fail",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : true,
"name" : "Root pass-waiting-FAIL",
"status" : "FAIL",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
},
{
"hasPass" : false,
"name" : "Root grouping PASS (subtask PASS)",
"status" : "PASS",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
},
{
"hasPass" : false,
"name" : "Root grouping WAITING (subtask READY)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask READY",
"status" : "READY",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
}
]
},
{
"hasPass" : false,
"name" : "Root grouping WAITING (subtask FAIL)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : true,
"hint" : "You must now run the ready task",
"name" : "Root READY (subtask PASS)",
"status" : "READY",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
},
{
"hasPass" : true,
"name" : "Root WAITING (subtask READY)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask READY",
"status" : "READY",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
}
]
},
{
"hasPass" : true,
"name" : "Root WAITING (subtask FAIL)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : true,
"inProgress" : true,
"name" : "Root IN PROGRESS",
"status" : "READY"
},
{
"hasPass" : true,
"inProgress" : false,
"name" : "Root NOT IN PROGRESS",
"status" : "READY"
},
{
"hasPass" : false,
"name" : "Root Optional subtasks",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : false,
"name" : "Subtask Optional",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Subtask FAIL",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Subtask READY",
"status" : "READY",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
}
]
}
]
}
]
},
{
"hasPass" : false,
"name" : "Subtasks File",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "file task/common.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "file task/common.config FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : false,
"name" : "Subtasks File (Missing)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "file task/common.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "file task/common.config FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : false,
"name" : "Subtasks External",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "userfile task/special.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "userfile task/special.config FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : false,
"name" : "Subtasks External (Missing)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "userfile task/special.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "userfile task/special.config FAIL",
"status" : "FAIL"
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Subtasks External (User Missing)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "userfile task/special.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "userfile task/special.config FAIL",
"status" : "FAIL"
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Subtasks External (File Missing)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "userfile task/special.config PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "userfile task/special.config FAIL",
"status" : "FAIL"
}
]
},
{
"hasPass" : false,
"name" : "Root tasks-factory",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "my a task",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "my b task",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "my c task",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "my d task Change Number(_change3_number) Change Id(_change3_id) Change Project(_change3_project) Change Branch(_change3_branch) Change Status(_change3_status) Change Topic(_change3_topic)",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "_change1_number",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "_change2_number",
"status" : "FAIL"
}
]
},
{
"hasPass" : true,
"name" : "Root tasks-factory static (empty name PASS)",
"status" : "PASS"
},
{
"exported" : {
"root" : "Root Properties"
},
"hasPass" : true,
"hint" : "Name(Root Properties) Change Number(_change3_number) Change Id(_change3_id) Change Project(_change3_project) Change Branch(_change3_branch) Change Status(_change3_status) Change Topic(_change3_topic)",
"name" : "Root Properties",
"status" : "FAIL",
"subTasks" : [
{
"exported" : {
"subtask" : "Subtask Properties"
},
"hasPass" : false,
"name" : "Subtask Properties",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"hint" : "Name(Subtask Properties Hints) root-property(root-value) first-property(first-value) second-property(first-value second-extra third-value) root(Root Properties)",
"name" : "Subtask Properties Hints",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Chained Subtask Properties",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Subtask Properties Reset",
"status" : "PASS"
},
{
"hasPass" : true,
"hint" : "Name(_change3_number) Change Number(_change3_number) Change Id(_change3_id) Change Project(_change3_project) Change Branch(_change3_branch) Change Status(_change3_status) Change Topic(_change3_topic)",
"name" : "_change3_number",
"status" : "FAIL"
},
{
"hasPass" : true,
"hint" : "Name(_change1_number) Change Number(_change3_number) Change Id(_change3_id) Change Project(_change3_project) Change Branch(_change3_branch) Change Status(_change3_status) Change Topic(_change3_topic)",
"name" : "_change1_number",
"status" : "FAIL"
}
]
}
]
},
{
"hasPass" : true,
"name" : "Root Preload",
"status" : "FAIL",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask Preload",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Subtask Preload Preload",
"status" : "PASS"
},
{
"hasPass" : true,
"hint" : "Task is ready",
"name" : "Subtask Preload Hints PASS",
"status" : "READY"
},
{
"hasPass" : true,
"hint" : "Task failed",
"name" : "Subtask Preload Hints FAIL",
"status" : "FAIL"
},
{
"hasPass" : true,
"name" : "Subtask Preload Override Pass",
"status" : "READY"
},
{
"hasPass" : true,
"name" : "Subtask Preload Override Fail",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Subtask Preload Extend Subtasks",
"status" : "READY",
"subTasks" : [
{
"hasPass" : true,
"name" : "Subtask PASS",
"status" : "PASS"
},
{
"hasPass" : true,
"name" : "Subtask APPLICABLE",
"status" : "PASS"
}
]
},
{
"hasPass" : true,
"name" : "Subtask Preload Optional",
"status" : "PASS"
},
{
"hasPass" : true,
"hint" : "second-property(first-value second-extra third-value) fourth-property(fourth-value)",
"name" : "Subtask Preload Properties",
"status" : "FAIL"
}
]
}
]
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
},
{
"hasPass" : false,
"name" : "INVALIDS",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : false,
"name" : "No PASS criteria",
"status" : "INVALID"
},
{
"hasPass" : true,
"name" : "WAITING (subtask INVALID)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : false,
"name" : "Subtask INVALID",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "WAITING (subtask duplicate)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : false,
"name" : "Subtask INVALID",
"status" : "INVALID"
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : true,
"name" : "WAITING (subtask missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Grouping WAITING (subtask INVALID)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : false,
"name" : "Subtask INVALID",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Grouping WAITING (subtask missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Subtask INVALID",
"status" : "INVALID"
},
{
"hasPass" : false,
"name" : "Subtask Optional",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "Looping",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
},
{
"hasPass" : false,
"name" : "task (tasks-factory missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory type missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory type INVALID)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory duplicate)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "duplicate",
"status" : "FAIL"
},
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory changes type missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory changes missing)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (names-factory changes invalid)",
"status" : "WAITING",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : false,
"name" : "task (tasks-factory changes loop)",
"status" : "WAITING",
"subTasks" : [
{
"hasPass" : true,
"name" : "_change1_number",
"status" : "FAIL",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
},
{
"hasPass" : true,
"name" : "_change2_number",
"status" : "FAIL",
"subTasks" : [
{
"name" : "UNKNOWN",
"status" : "INVALID"
}
]
}
]
}
]
}
]
}
],
...
```