Template:HFUT-china/unittestJs

function toArray(iter) {

   if (iter === null) {
       return null;
   }
   return Array.prototype.slice.call(iter);

}

function find(selector, elem) {

   if (!elem) {
       elem = document;
   }
   return elem.querySelector(selector);

}

function find_all(selector, elem) {

   if (!elem) {
       elem = document;
   }
   return toArray(elem.querySelectorAll(selector));

}

function sort_column(elem) {

   toggle_sort_states(elem);
   var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
   var key;
   if (elem.classList.contains('numeric')) {
       key = key_num;
   } else if (elem.classList.contains('result')) {
       key = key_result;
   } else {
       key = key_alpha;
   }
   sort_table(elem, key(colIndex));

}

function show_all_extras() {

   find_all('.col-result').forEach(show_extras);

}

function hide_all_extras() {

   find_all('.col-result').forEach(hide_extras);

}

function show_extras(colresult_elem) {

   var extras = colresult_elem.parentNode.nextElementSibling;
   var expandcollapse = colresult_elem.firstElementChild;
   extras.classList.remove("collapsed");
   expandcollapse.classList.remove("expander");
   expandcollapse.classList.add("collapser");

}

function hide_extras(colresult_elem) {

   var extras = colresult_elem.parentNode.nextElementSibling;
   var expandcollapse = colresult_elem.firstElementChild;
   extras.classList.add("collapsed");
   expandcollapse.classList.remove("collapser");
   expandcollapse.classList.add("expander");

}

function show_filters() {

   var filter_items = document.getElementsByClassName('filter');
   for (var i = 0; i < filter_items.length; i++)
       filter_items[i].hidden = false;

}

function add_collapse() {

   // Add links for show/hide all
   var resulttable = find('table#results-table');
   var showhideall = document.createElement("p");
   showhideall.innerHTML = '<a href="javascript:show_all_extras()">Show all details</a> / ' +
                           '<a href="javascript:hide_all_extras()">Hide all details</a>';
   resulttable.parentElement.insertBefore(showhideall, resulttable);
   // Add show/hide link to each result
   find_all('.col-result').forEach(function(elem) {
       var extras = elem.parentNode.nextElementSibling;
       var expandcollapse = document.createElement("span");
       if (elem.innerHTML === 'Passed') {
           extras.classList.add("collapsed");
           expandcollapse.classList.add("expander");
       } else {
           expandcollapse.classList.add("collapser");
       }
       elem.appendChild(expandcollapse);
       elem.addEventListener("click", function(event) {
           if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) {
               show_extras(event.currentTarget);
           } else {
               hide_extras(event.currentTarget);
           }
       });
   })

} addEventListener("DOMContentLoaded", function() {

   reset_sort_headers();
   add_collapse();
   show_filters();
   toggle_sort_states(find('.initial-sort'));
   find_all('.sortable').forEach(function(elem) {
       elem.addEventListener("click",
                             function(event) {
                                 sort_column(elem);
                             }, false)
   });

});

function sort_table(clicked, key_func) {

   var rows = find_all('.results-table-row');
   var reversed = !clicked.classList.contains('asc');
   var sorted_rows = sort(rows, key_func, reversed);
   /* Whole table is removed here because browsers acts much slower
    * when appending existing elements.
    */
   var thead = document.getElementById("results-table-head");
   document.getElementById('results-table').remove();
   var parent = document.createElement("table");
   parent.id = "results-table";
   parent.appendChild(thead);
   sorted_rows.forEach(function(elem) {
       parent.appendChild(elem);
   });
   document.getElementsByTagName("BODY")[0].appendChild(parent);

}

function sort(items, key_func, reversed) {

   var sort_array = items.map(function(item, i) {
       return [key_func(item), i];
   });
   var multiplier = reversed ? -1 : 1;
   sort_array.sort(function(a, b) {
       var key_a = a[0];
       var key_b = b[0];
       return multiplier * (key_a >= key_b ? 1 : -1);
   });
   return sort_array.map(function(item) {
       var index = item[1];
       return items[index];
   });

}

function key_alpha(col_index) {

   return function(elem) {
       return elem.childNodes[1].childNodes[col_index].firstChild.data.toLowerCase();
   };

}

function key_num(col_index) {

   return function(elem) {
       return parseFloat(elem.childNodes[1].childNodes[col_index].firstChild.data);
   };

}

function key_result(col_index) {

   return function(elem) {
       var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
                      'Skipped', 'Passed'];
       return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data);
   };

}

function reset_sort_headers() {

   find_all('.sort-icon').forEach(function(elem) {
       elem.parentNode.removeChild(elem);
   });
   find_all('.sortable').forEach(function(elem) {
       var icon = document.createElement("div");
       icon.className = "sort-icon";
       icon.textContent = "vvv";
       elem.insertBefore(icon, elem.firstChild);
       elem.classList.remove("desc", "active");
       elem.classList.add("asc", "inactive");
   });

}

function toggle_sort_states(elem) {

   //if active, toggle between asc and desc
   if (elem.classList.contains('active')) {
       elem.classList.toggle('asc');
       elem.classList.toggle('desc');
   }
   //if inactive, reset all other functions and add ascending active
   if (elem.classList.contains('inactive')) {
       reset_sort_headers();
       elem.classList.remove('inactive');
       elem.classList.add('active');
   }

}

function is_all_rows_hidden(value) {

 return value.hidden == false;

}

function filter_table(elem) {

   var outcome_att = "data-test-result";
   var outcome = elem.getAttribute(outcome_att);
   class_outcome = outcome + " results-table-row";
   var outcome_rows = document.getElementsByClassName(class_outcome);
   for(var i = 0; i < outcome_rows.length; i++){
       outcome_rows[i].hidden = !elem.checked;
   }
   var rows = find_all('.results-table-row').filter(is_all_rows_hidden);
   var all_rows_hidden = rows.length == 0 ? true : false;
   var not_found_message = document.getElementById("not-found-message");
   not_found_message.hidden = !all_rows_hidden;

}