Output PASS/FAIL for each task root test

Provide more granular explanations of the features that pass/fail when
testing the task plugin.

Change-Id: I7d499c112e237d83025d92d4695f0c282634c1b0
diff --git a/test/check_task_statuses.sh b/test/check_task_statuses.sh
index 088661e..b5a3490 100755
--- a/test/check_task_statuses.sh
+++ b/test/check_task_statuses.sh
@@ -29,6 +29,30 @@
     fi
 }
 
+# output must match expected to pass
+result_out() { # test expected actual
+    local name=$1 expected=$2 actual=$3
+
+    [ "$expected" = "$actual" ]
+    result "$name" "$(diff <(echo "$expected") <(echo "$actual"))"
+}
+
+result_root() { # group root expected_file actual_file
+    local name="$1 - $(echo "$2" | sed -es'/Root //')"
+    result_out "$name" "$(get_root "$2" < "$3")" "$(get_root "$2" < "$4")"
+}
+
+# -------- Git Config
+
+config() { git config -f "$CONFIG" "$@" ; } # [args]...
+config_section_keys() { # section > keys ...
+    # handlers.handler-filter filter.sh -> handler-filter
+    config -l --name-only |\
+        grep "^$1\." | \
+        sed -es"/^$1\.//;s/\..*$//" |\
+        awk '$0 != prev ; {prev = $0}'
+}
+
 # -------- Pre JSON --------
 #
 # pre_json is a "templated json" used in the test docs to express test results. It looks
@@ -160,6 +184,16 @@
     sed -e"s/testuser/$USER/"
 }
 
+get_root() { # root < task_plugin_ouptut > root_json
+    python -c "if True: # NOP to start indent
+        import sys, json
+
+        roots=json.loads(sys.stdin.read())['plugins'][0]['roots']
+        for root in roots:
+            if 'name' in root.keys() and root['name']=='$1':
+                print json.dumps(root, indent=3, separators=(',', ' : '), sort_keys=True)"
+}
+
 example() { # example_num
     echo "$DOC_STATES" | awk '/```/{Q++;E=(Q+1)/2};E=='"$1" | grep -v '```' | replace_user
 }
@@ -220,11 +254,15 @@
 
 test_tasks() { # name expected_file task_args...
     local name=$1 expected=$2 ; shift 2
-    local output=$STATUSES.$name
+    local output=$STATUSES.$name out root
 
     query_plugins "$@" > "$output"
-    out=$(diff "$expected" "$output")
-    result "$name" "$out"
+    echo "$ROOTS" | while read root ; do
+        result_root "$name" "$root" "$expected" "$output"
+    done
+    out=$(diff "$expected" "$output" | head -15)
+    [ -z "$out" ]
+    result "$name - Full Test Suite" "$out"
 }
 
 test_generated() { # name task_args...
@@ -275,13 +313,14 @@
 REF_ALL=refs/meta/config
 REF_USERS=refs/users/self
 
-mkdir -p "$OUT"
+CONFIG=$ROOT_CFG
+
+mkdir -p "$OUT" "$ALL_TASKS" "$USER_TASKS"
+
 q_setup setup_repo "$ALL" "$REMOTE_ALL" "$REF_ALL"
 q_setup setup_repo "$USERS" "$REMOTE_USERS" "$REF_USERS" --initial-commit
 q_setup setup_repo "$OUT/$PROJECT" "$REMOTE_TEST" "$BRANCH"
 
-mkdir -p "$ALL_TASKS" "$USER_TASKS"
-
 changes=$(gssh query "status:open limit:2" --format json)
 set_change "$(echo "$changes" | awk 'NR==1')" ; CHANGE1=("${CHANGE[@]}")
 set_change "$(echo "$changes" | awk 'NR==2')" ; CHANGE2=("${CHANGE[@]}")
@@ -292,6 +331,8 @@
 example 4 > "$INVALIDS_CFG"
 example 5 > "$USER_SPECIAL_CFG"
 
+ROOTS=$(config_section_keys "root")
+
 q_setup update_repo "$ALL" "$REMOTE_ALL" "$REF_ALL"
 q_setup update_repo "$USERS" "$REMOTE_USERS" "$REF_USERS"
 
@@ -320,22 +361,25 @@
 "$MYDIR"/strip_non_invalid.py < "$EXPECTED".applicable > "$EXPECTED".invalid-applicable
 
 
-testdoc_2_cfg < "$DOC_PREVIEW" | replace_user > "$ROOT_CFG"
-
 preview_pjson=$(testdoc_2_pjson < "$DOC_PREVIEW" | replace_default_changes)
 echo "$preview_pjson" | remove_suite invalid | json_pp > "$EXPECTED".preview
 echo "$preview_pjson" | remove_not_suite invalid | \
     "$MYDIR"/strip_non_invalid.py > "$EXPECTED".preview-invalid
 
+testdoc_2_cfg < "$DOC_PREVIEW" | replace_user > "$ROOT_CFG"
+cnum=$(create_repo_change "$ALL" "$REMOTE_ALL" "$REF_ALL")
+PREVIEW_ROOTS=$(config_section_keys "root")
+
+
 RESULT=0
 query="change:$change3_number status:open"
 test_generated applicable --task--applicable "$query"
 test_generated all --task--all "$query"
 
-cnum=$(create_repo_change "$ALL" "$REMOTE_ALL" "$REF_ALL")
-test_generated preview --task--preview "$cnum,1" --task--all "$query"
-test_generated preview-invalid --task--preview "$cnum,1" --task--invalid "$query"
-
 test_generated invalid --task--invalid "$query"
 test_generated invalid-applicable --task--applicable --task--invalid "$query"
+
+ROOTS=$PREVIEW_ROOTS
+test_generated preview --task--preview "$cnum,1" --task--all "$query"
+test_generated preview-invalid --task--preview "$cnum,1" --task--invalid "$query"
 exit $RESULT