Merge pull request #8 from jpchase/CB-8295

CB-8295 Enable CSP for mobile spec
diff --git a/www/assets/main.css b/www/assets/main.css
index fe47a1e..7665448 100644
--- a/www/assets/main.css
+++ b/www/assets/main.css
@@ -123,11 +123,10 @@
 }
 
 #test-enablers-container {
-  margin: 10px 0px;
+  margin: 10px 5px;
 }
 
 #test-expander {
-  margin: 5px;
   text-decoration: underline;
 }
 
diff --git a/www/main.js b/www/main.js
index a2412b0..f83b7b2 100644
--- a/www/main.js
+++ b/www/main.js
@@ -21,8 +21,6 @@
 
 'use strict';
 
-var autoFirstTime = true;
-
 /******************************************************************************/
 
 function getMode(callback) {
@@ -153,16 +151,10 @@
 /******************************************************************************/
 
 function setupAutoTestsEnablers(cdvtests) {
-  
   var enablerList = createEnablerList();
 
   // Iterate over all the registered test modules
-  Object.keys(cdvtests.tests).forEach(function(api) {
-    var testModule = cdvtests.tests[api];
-    
-    if (!testModule.hasOwnProperty('defineAutoTests'))
-      return;
-    
+  iterateAutoTests(cdvtests, function(api, testModule) {
     // For "standard" plugins remove the common/repetitive bits of
     // the api key, for use as the title.  For third-party plugins, the full
     // api will be used as the title
@@ -170,6 +162,8 @@
 
     createEnablerCheckbox(api, title, testModule.getEnabled(), enablerList.id, toggleTestHandler);
   });
+
+  updateEnabledTestCount();
 }
 
 /******************************************************************************/
@@ -179,63 +173,87 @@
 
   var enablerContainer = document.createElement('div');
   enablerContainer.id = 'test-enablers-container';
-  
+
+  // Create header to show count of enabled/total tests
+  var header = document.createElement('h3');
+  header.id = 'tests-enabled';
+
+  // Create widget to show/hide list
   var expander = document.createElement('span');
   expander.id = 'test-expander';
   expander.innerText = 'Show/hide tests to be run';
   expander.onclick = toggleEnablerVisibility;
 
+  // Create list to contain checkboxes for each test
   var enablerList = document.createElement('div');
   enablerList.id = "test-list";
-  
+
+  // Create select/deselect all buttons (in button bar)
   var checkButtonBar = document.createElement('ul');
   checkButtonBar.classList.add('topcoat-button-bar');
-  
-  for (var i = 0; i < 2; i++)
-  {
+
+  function createSelectToggleButton(title, selected) {
     var barItem = document.createElement('li');
     barItem.classList.add('topcoat-button-bar__item');
-    
+
     var link = document.createElement('a');
-    var selected = (i === 0);
     link.classList.add('topcoat-button-bar__button');
-    link.innerText = selected ? 'Check all' : 'Uncheck all';
+    link.innerText = title;
     link.href = null;
-    link.onclick = (function(select) {
-      return function(e) {
-        e.preventDefault();
-        toggleSelected(enablerList.id, select);
-        return false;
-      };
-    })(selected);
+    link.onclick = function(e) {
+      e.preventDefault();
+      toggleSelected(enablerList.id, selected);
+      return false;
+    };
 
     barItem.appendChild(link);
     checkButtonBar.appendChild(barItem);
-  }
-
+  };
+  createSelectToggleButton('Check all', true);
+  createSelectToggleButton('Uncheck all', false);
   enablerList.appendChild(checkButtonBar);
-  
+
+  enablerContainer.appendChild(header);
   enablerContainer.appendChild(expander);
   enablerContainer.appendChild(enablerList);
-  
+
   buttons.appendChild(enablerContainer);
-  
+
   return enablerList;
 }
 
 /******************************************************************************/
 
-function toggleSelected(containerId, newCheckedValue) {
-  var container = document.getElementById(containerId);
-  
-  var cbs = container.getElementsByTagName('input');
-  
-  for (var i = 0; i < cbs.length; i++) {
-    if(cbs[i].type === 'checkbox') {
-      cbs[i].checked = newCheckedValue;
-      toggleTestEnabled(cbs[i]);
+function updateEnabledTestCount() {
+  var enabledLabel = document.getElementById('tests-enabled');
+
+  // Determine how many tests are currently enabled
+  var cdvtests = cordova.require('org.apache.cordova.test-framework.cdvtests');
+  var total = 0;
+  var enabled = 0;
+  iterateAutoTests(cdvtests, function(api, testModule) {
+    total++;
+    if (testModule.getEnabled()) {
+      enabled++;
     }
-  }    
+  });
+
+  if (enabled == total) {
+    enabledLabel.innerText = 'Running All Tests.';
+  } else {
+    enabledLabel.innerText = 'Running ' + enabled + ' of ' + total + ' Tests.';
+  }
+}
+
+/******************************************************************************/
+
+function toggleSelected(containerId, newCheckedValue) {
+  [].forEach.call(document.getElementById(containerId).getElementsByTagName('input'), function(input) {
+    if (input.type !== 'checkbox') return;
+    input.checked = newCheckedValue;
+    toggleTestEnabled(input);
+  });
+  updateEnabledTestCount();
 }
 
 /******************************************************************************/
@@ -256,7 +274,7 @@
 
   var label = document.createElement('label');
   label.classList.add('topcoat-checkbox');
-  
+
   var checkbox = document.createElement('input');
   checkbox.type = "checkbox";
   checkbox.value = api;
@@ -270,10 +288,10 @@
 
   var div = document.createElement('div');
   div.classList.add('topcoat-checkbox__checkmark');
-  
+
   var text = document.createElement('span');
   text.innerText = title;
-  
+
   label.appendChild(checkbox);
   label.appendChild(div);
   label.appendChild(text);
@@ -285,8 +303,9 @@
 
 function toggleTestHandler(event) {
   var checkbox = event.target;
-  
+
   toggleTestEnabled(checkbox);
+  updateEnabledTestCount();
 }
 
 /******************************************************************************/
@@ -298,6 +317,18 @@
 
 /******************************************************************************/
 
+function iterateAutoTests(cdvtests, callback) {
+  Object.keys(cdvtests.tests).forEach(function(api) {
+    var testModule = cdvtests.tests[api];
+    if (!testModule.hasOwnProperty('defineAutoTests')) {
+      return;
+    }
+    callback(api, testModule);
+  });
+}
+
+/******************************************************************************/
+
 function runAutoTests() {
   setTitle('Auto Tests');
 
@@ -308,20 +339,12 @@
   var cdvtests = cordova.require('org.apache.cordova.test-framework.cdvtests');
   cdvtests.init();
   setupAutoTestsEnablers(cdvtests);
-  
+
   cdvtests.defineAutoTests();
 
   // Run the tests!
   var jasmineEnv = window.jasmine.getEnv();
-  
-  if (autoFirstTime) {
-    autoFirstTime = false;
-    // Uncomment to skip running of tests on initial load
-    //  - If you're testing a specific plugin, you probably want to uncomment,
-    //    so you don't have to wait for all the tests to run every time
-    //return;
-  }
-  
+
   jasmineEnv.execute();
 }