Revert "Revert "plugin:task Adds support for names-factory of type change""
This reverts commit f99c7570a66adb9155320b33053e8538c1515f0f.
Re-add this functionality with tests passing.
Change-Id: I3b02981a9707b466d5b79e421c270a2fe5d322b5
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
index ef23533..d9e8c4b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java
@@ -31,7 +31,19 @@
/** Task Configuration file living in git */
public class TaskConfig extends AbstractVersionedMetaData {
- protected class Section extends Container {
+ public enum NamesFactoryType {
+ CHANGE,
+ STATIC;
+
+ public static NamesFactoryType getNamesFactoryType(String str) {
+ for (NamesFactoryType type : NamesFactoryType.values()) {
+ if (type.name().equalsIgnoreCase(str)) return type;
+ }
+ return null;
+ }
+ }
+
+ private class Section extends Container {
public TaskConfig config;
public Section() {
@@ -112,10 +124,12 @@
}
public class NamesFactory extends Section {
+ public String changes;
public List<String> names;
public String type;
public NamesFactory(SubSection s) {
+ changes = getString(s, KEY_CHANGES, null);
names = getStringList(s, KEY_NAME);
type = getString(s, KEY_TYPE, null);
}
@@ -142,6 +156,7 @@
protected static final String SECTION_TASK = "task";
protected static final String SECTION_TASKS_FACTORY = "tasks-factory";
protected static final String KEY_APPLICABLE = "applicable";
+ protected static final String KEY_CHANGES = "changes";
protected static final String KEY_EXPORT_PREFIX = "export-";
protected static final String KEY_FAIL = "fail";
protected static final String KEY_FAIL_HINT = "fail-hint";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
index 99a1ba9..13600e6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
@@ -14,6 +14,8 @@
package com.googlesource.gerrit.plugins.task;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.query.QueryParseException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -21,10 +23,15 @@
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeQueryProcessor;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.task.TaskConfig.External;
import com.googlesource.gerrit.plugins.task.TaskConfig.NamesFactory;
+import com.googlesource.gerrit.plugins.task.TaskConfig.NamesFactoryType;
import com.googlesource.gerrit.plugins.task.TaskConfig.Task;
import com.googlesource.gerrit.plugins.task.TaskConfig.TasksFactory;
import com.googlesource.gerrit.plugins.task.cli.PatchSetArgument;
@@ -47,6 +54,7 @@
* lazily loaded tree, and much of the tree validity is enforced at this layer.
*/
public class TaskTree {
+ private static final FluentLogger log = FluentLogger.forEnclosingClass();
protected static final String TASK_DIR = "task";
protected final AccountResolver accountResolver;
@@ -54,6 +62,8 @@
protected final CurrentUser user;
protected final TaskConfigFactory taskFactory;
protected final Root root = new Root();
+ protected final Provider<ChangeQueryBuilder> changeQueryBuilderProvider;
+ protected final Provider<ChangeQueryProcessor> changeQueryProcessorProvider;
@Inject
public TaskTree(
@@ -61,11 +71,15 @@
AllUsersNameProvider allUsers,
AnonymousUser anonymousUser,
CurrentUser user,
- TaskConfigFactory taskFactory) {
+ TaskConfigFactory taskFactory,
+ Provider<ChangeQueryBuilder> changeQueryBuilderProvider,
+ Provider<ChangeQueryProcessor> changeQueryProcessorProvider) {
this.accountResolver = accountResolver;
this.allUsers = allUsers;
this.user = user != null ? user : anonymousUser;
this.taskFactory = taskFactory;
+ this.changeQueryProcessorProvider = changeQueryProcessorProvider;
+ this.changeQueryBuilderProvider = changeQueryBuilderProvider;
}
public void masquerade(PatchSetArgument psa) {
@@ -188,11 +202,15 @@
TasksFactory tasksFactory = definition.config.getTasksFactory(taskFactoryName);
if (tasksFactory != null) {
NamesFactory namesFactory = definition.config.getNamesFactory(tasksFactory.namesFactory);
- if (namesFactory != null && "static".equals(namesFactory.type)) {
- for (String name : namesFactory.names) {
- taskList.add(definition.config.createTask(tasksFactory, name));
+ if (namesFactory != null && namesFactory.type != null) {
+ switch (NamesFactoryType.getNamesFactoryType(namesFactory.type)) {
+ case STATIC:
+ getStaticTypeTasksDefinitions(tasksFactory, namesFactory, taskList);
+ continue;
+ case CHANGE:
+ getChangesTypeTaskDefinitions(tasksFactory, namesFactory, taskList);
+ continue;
}
- continue;
}
}
taskList.add(null);
@@ -200,6 +218,33 @@
return taskList;
}
+ protected void getStaticTypeTasksDefinitions(
+ TasksFactory tasksFactory, NamesFactory namesFactory, List<Task> taskList) {
+ for (String name : namesFactory.names) {
+ taskList.add(definition.config.createTask(tasksFactory, name));
+ }
+ }
+
+ protected void getChangesTypeTaskDefinitions(
+ TasksFactory tasksFactory, NamesFactory namesFactory, List<Task> taskList) {
+ try {
+ if (namesFactory.changes != null) {
+ List<ChangeData> changeDataList =
+ changeQueryProcessorProvider
+ .get()
+ .query(changeQueryBuilderProvider.get().parse(namesFactory.changes)).entities();
+ for (ChangeData changeData : changeDataList) {
+ taskList.add(definition.config.createTask(tasksFactory, changeData.getId().toString()));
+ }
+ return;
+ }
+ } catch (OrmException e) {
+ log.atSevere().withCause(e).log("ERROR: running changes query: " + namesFactory.changes);
+ } catch (QueryParseException e) {
+ }
+ taskList.add(null);
+ }
+
protected List<Task> getTaskDefinitions(External external)
throws ConfigInvalidException, IOException, OrmException {
return getTaskDefinitions(resolveUserBranch(external.user), external.file);
diff --git a/src/main/resources/Documentation/task.md b/src/main/resources/Documentation/task.md
index 9fe4e3d..4a38c61 100644
--- a/src/main/resources/Documentation/task.md
+++ b/src/main/resources/Documentation/task.md
@@ -331,6 +331,16 @@
The following keys may be defined in any names-factory section:
+`changes`
+
+: This key defines a query that is used to fetch change numbers which will be used
+as the names of the task(s).
+
+Example:
+```
+ changes = change:1 OR change:2
+```
+
`name`
: This key defines the name of the tasks. This key may be used several times
@@ -345,12 +355,15 @@
`type`
-: This key defines the type of the names-factory section. The only
-accepted value is `static`.
+: This key defines the type of the names-factory section. The type
+can be either `static` or `change`. For names-factory of type `static`,
+`name` key(s) should be defined where as names-factory of type `change`
+needs a `change` key to be defined.
Example:
```
type = static
+ type = change
```
External Entries
diff --git a/src/main/resources/Documentation/task_states.md b/src/main/resources/Documentation/task_states.md
index 58d6ca7..0c29233 100644
--- a/src/main/resources/Documentation/task_states.md
+++ b/src/main/resources/Documentation/task_states.md
@@ -105,9 +105,11 @@
[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
@@ -147,6 +149,10 @@
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
@@ -265,6 +271,10 @@
[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`.
@@ -341,20 +351,75 @@
[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
-[tasks-factory "tasks-factory (names-factory type INVALID)"]
- names-factory = name-factory (type INVALID)
+[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`.
@@ -686,6 +751,16 @@
"hasPass" : true,
"name" : "my c task",
"status" : "FAIL"
+ },
+ {
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL"
+ },
+ {
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL"
}
]
},
@@ -940,6 +1015,84 @@
"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"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/test/all b/test/all
index 6e29127..6c4f10e 100644
--- a/test/all
+++ b/test/all
@@ -380,6 +380,18 @@
"hasPass" : true,
"name" : "my c task",
"status" : "FAIL"
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL"
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL"
}
]
},
@@ -692,6 +704,92 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "duplicate",
+ "status" : "FAIL"
+ },
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
},
@@ -876,6 +974,92 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "duplicate",
+ "status" : "FAIL"
+ },
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/test/check_task_statuses.sh b/test/check_task_statuses.sh
index 3b2bf0b..abe209f 100755
--- a/test/check_task_statuses.sh
+++ b/test/check_task_statuses.sh
@@ -16,6 +16,7 @@
}
# --------
+gssh() { ssh -x -p "$PORT" "$SERVER" gerrit "$@" ; } # cmd [args]...
q() { "$@" > /dev/null 2>&1 ; } # cmd [args...] # quiet a command
@@ -79,10 +80,10 @@
}
query() { # query
- ssh -x -p "$PORT" "$SERVER" gerrit query "$@" \
- --format json | head -1 | python -c "import sys, json; \
- print json.dumps(json.loads(sys.stdin.read()), indent=3, \
- separators=(',', ' : '), sort_keys=True)"
+ gssh query "$@" \
+ --format json | head -1 | python -c "import sys, json; \
+ print json.dumps(json.loads(sys.stdin.read()), indent=3, \
+ separators=(',', ' : '), sort_keys=True)"
}
query_plugins() { query "$@" | awk '$0==" \"plugins\" : [",$0==" ],"' ; }
@@ -101,6 +102,10 @@
test_tasks "$name" "$MYDIR/$name" "$@"
}
+update_change_number() { # file change_number change_token
+ sed -i -e "s|_change$3_number|$2|" "$1"
+}
+
MYDIR=$(dirname "$0")
DOCS=$MYDIR/.././src/main/resources/Documentation
OUT=$MYDIR/../target/tests
@@ -139,6 +144,20 @@
mkdir -p "$ALL_TASKS" "$USER_TASKS"
+CHANGES=($(gssh query "status:open limit:2" | grep 'number:' | awk '{print $2}'))
+update_change_number "$DOC_STATES" "${CHANGES[0]}" "1"
+update_change_number "$DOC_STATES" "${CHANGES[1]}" "2"
+update_change_number "$MYDIR/all" "${CHANGES[0]}" "1"
+update_change_number "$MYDIR/all" "${CHANGES[1]}" "2"
+update_change_number "$MYDIR/preview" "${CHANGES[0]}" "1"
+update_change_number "$MYDIR/preview" "${CHANGES[1]}" "2"
+update_change_number "$MYDIR/preview.invalid" "${CHANGES[0]}" "1"
+update_change_number "$MYDIR/preview.invalid" "${CHANGES[1]}" "2"
+update_change_number "$MYDIR/invalid" "${CHANGES[0]}" "1"
+update_change_number "$MYDIR/invalid" "${CHANGES[1]}" "2"
+update_change_number "$MYDIR/invalid-applicable" "${CHANGES[0]}" "1"
+update_change_number "$MYDIR/invalid-applicable" "${CHANGES[1]}" "2"
+
example 1 |sed -e"s/current-user/$USER/" > "$ROOT_CFG"
example 2 > "$COMMON_CFG"
example 3 > "$INVALIDS_CFG"
diff --git a/test/docker/run_tests/create-test-project-and-changes.sh b/test/docker/run_tests/create-test-project-and-changes.sh
index 159882b..6192461 100755
--- a/test/docker/run_tests/create-test-project-and-changes.sh
+++ b/test/docker/run_tests/create-test-project-and-changes.sh
@@ -16,17 +16,8 @@
touch readme.txt && echo "$(date)" >> readme.txt
git add . && git commit -m "$1"
git push ssh://"$GERRIT_HOST":"$PORT"/"$2" HEAD:refs/for/master
- commitRevision=$(git rev-parse HEAD)
-}
-
-submit_change() { # commit_revision
- gssh review --code-review +2 --submit "$1"
}
create_project 'test'
create_change 'Change 1' 'test'
-commit1Revision=$commitRevision
create_change 'Change 2' 'test'
-#sleep to avoid race conditions
-sleep 60
-submit_change "$commit1Revision"
diff --git a/test/invalid b/test/invalid
index adab1d1..4e2984e 100644
--- a/test/invalid
+++ b/test/invalid
@@ -215,6 +215,86 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
},
@@ -387,6 +467,86 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/test/invalid-applicable b/test/invalid-applicable
index 449e595..867c177 100644
--- a/test/invalid-applicable
+++ b/test/invalid-applicable
@@ -159,6 +159,79 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "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"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/test/preview b/test/preview
index e74d35d..235eaca 100644
--- a/test/preview
+++ b/test/preview
@@ -171,6 +171,92 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "duplicate",
+ "status" : "FAIL"
+ },
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
},
@@ -390,6 +476,92 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "duplicate",
+ "status" : "FAIL"
+ },
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
}
diff --git a/test/preview.invalid b/test/preview.invalid
index 056bb80..3f0c844 100644
--- a/test/preview.invalid
+++ b/test/preview.invalid
@@ -171,6 +171,86 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
},
@@ -343,6 +423,86 @@
"status" : "INVALID"
}
]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory duplicate)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes type missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes missing)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (names-factory changes invalid)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : false,
+ "name" : "task (tasks-factory changes loop)",
+ "status" : "WAITING",
+ "subTasks" : [
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change1_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ },
+ {
+ "applicable" : true,
+ "hasPass" : true,
+ "name" : "_change2_number",
+ "status" : "FAIL",
+ "subTasks" : [
+ {
+ "name" : "UNKNOWN",
+ "status" : "INVALID"
+ }
+ ]
+ }
+ ]
}
]
}