Bug 629734: Add todo functionality to xpcshell; r=ted
authorKyle Huey <khuey@kylehuey.com>
Sun, 20 Feb 2011 19:54:14 -0500
changeset 64023 03d4f0aa5572bb845e89c2bcdef0a26a8db8e23d
parent 64022 6854c982a6be8c4ab273ced37e44ce4c0c5424c5
child 64024 d67af0cdc353524000ba4169ed9f3aad1a2624ca
push idunknown
push userunknown
push dateunknown
reviewersted
bugs629734
milestone2.2a1pre
Bug 629734: Add todo functionality to xpcshell; r=ted
testing/xpcshell/head.js
--- a/testing/xpcshell/head.js
+++ b/testing/xpcshell/head.js
@@ -1,8 +1,9 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et: */
 /* ***** BEGIN LICENSE BLOCK *****
  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  *
  * The contents of this file are subject to the Mozilla Public License Version
  * 1.1 (the "License"); you may not use this file except in compliance with
  * the License. You may obtain a copy of the License at
  * http://www.mozilla.org/MPL/
@@ -18,16 +19,17 @@
  * Portions created by the Initial Developer are Copyright (C) 2005
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *  Darin Fisher <darin@meer.net>
  *  Boris Zbarsky <bzbarsky@mit.edu>
  *  Jeff Walden <jwalden+code@mit.edu>
  *  Serge Gautherie <sgautherie.bz@free.fr>
+ *  Kyle Huey <me@kylehuey.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -43,16 +45,17 @@
  * See http://developer.mozilla.org/en/docs/Writing_xpcshell-based_unit_tests
  * for more information.
  */
 
 var _quit = false;
 var _passed = true;
 var _tests_pending = 0;
 var _passedChecks = 0, _falsePassedChecks = 0;
+var _todoChecks = 0;
 var _cleanupFunctions = [];
 var _pendingTimers = [];
 
 function _dump(str) {
   if (typeof _XPCSHELL_PROCESS == "undefined") {
     dump(str);
   } else {
     dump(_XPCSHELL_PROCESS + ": " + str);
@@ -354,16 +357,18 @@ function _execute_test() {
 
   if (!_passed)
     return;
 
   var truePassedChecks = _passedChecks - _falsePassedChecks;
   if (truePassedChecks > 0) {
     _dump("TEST-PASS | (xpcshell/head.js) | " + truePassedChecks + " (+ " +
             _falsePassedChecks + ") check(s) passed\n");
+    _dump("TEST-INFO | (xpcshell/head.js) | " + _todoChecks +
+            " check(s) todo\n");
   } else {
     // ToDo: switch to TEST-UNEXPECTED-FAIL when all tests have been updated. (Bug 496443)
     _dump("TEST-INFO | (xpcshell/head.js) | No (+ " + _falsePassedChecks + ") checks actually run\n");
   }
 }
 
 /**
  * Loads files.
@@ -441,16 +446,33 @@ function do_throw(text, stack) {
     _dump(frame + "\n");
     frame = frame.caller;
   }
 
   _do_quit();
   throw Components.results.NS_ERROR_ABORT;
 }
 
+function do_throw_todo(text, stack) {
+  if (!stack)
+    stack = Components.stacker.caller;
+
+  _passed = false;
+  _dump("TEST-UNEXPECTED-PASS | " + stack.filename + " | " + text +
+         " - See following stack:\n");
+  var frame = Components.stack;
+  while (frame != null) {
+    _dump(frame + "\n");
+    frame = frame.caller;
+  }
+
+  _do_quit();
+  throw Components.results.NS_ERROR_ABORT;
+}
+
 function do_report_unexpected_exception(ex, text) {
   var caller_stack = Components.stack.caller;
   text = text ? text + " - " : "";
 
   _passed = false;
   dump("TEST-UNEXPECTED-FAIL | " + caller_stack.filename + " | " + text +
          "Unexpected exception " + ex + ", see following stack:\n" + ex.stack +
          "\n");
@@ -463,58 +485,120 @@ function do_note_exception(ex, text) {
   var caller_stack = Components.stack.caller;
   text = text ? text + " - " : "";
 
   dump("TEST-INFO | " + caller_stack.filename + " | " + text +
          "Swallowed exception " + ex + ", see following stack:\n" + ex.stack +
          "\n");
 }
 
-function do_check_neq(left, right, stack) {
+function _do_check_neq(left, right, stack, todo) {
   if (!stack)
     stack = Components.stack.caller;
 
   var text = left + " != " + right;
   if (left == right) {
-    do_throw(text, stack);
+    if (!todo) {
+      do_throw(text, stack);
+    } else {
+      ++_todoChecks;
+      _dump("TEST-KNOWN-FAIL | " + stack.filename + " | [" + stack.name +
+            " : " + stack.lineNumber + "] " + text +"\n");
+    }
   } else {
-    ++_passedChecks;
-    _dump("TEST-PASS | " + stack.filename + " | [" + stack.name + " : " +
-         stack.lineNumber + "] " + text + "\n");
+    if (!todo) {
+      ++_passedChecks;
+      _dump("TEST-PASS | " + stack.filename + " | [" + stack.name + " : " +
+            stack.lineNumber + "] " + text + "\n");
+    } else {
+      do_throw_todo(text, stack);
+    }
+  }
+}
+
+function do_check_neq(left, right, stack) {
+  if (!stack)
+    stack = Components.stack.caller;
+
+  _do_check_neq(left, right, stack, false);
+}
+
+function todo_check_neq(left, right, stack) {
+  if (!stack)
+      stack = Components.stack.caller;
+
+  _do_check_neq(left, right, stack, true);
+}
+
+function _do_check_eq(left, right, stack, todo) {
+  if (!stack)
+    stack = Components.stack.caller;
+
+  var text = left + " == " + right;
+  if (left != right) {
+    if (!todo) {
+      do_throw(text, stack);
+    } else {
+      ++_todoChecks;
+      _dump("TEST-KNOWN-FAIL | " + stack.filename + " | [" + stack.name +
+            " : " + stack.lineNumber + "] " + text +"\n");
+    }
+  } else {
+    if (!todo) {
+      ++_passedChecks;
+      _dump("TEST-PASS | " + stack.filename + " | [" + stack.name + " : " +
+            stack.lineNumber + "] " + text + "\n");
+    } else {
+      do_throw_todo(text, stack);
+    }
   }
 }
 
 function do_check_eq(left, right, stack) {
   if (!stack)
     stack = Components.stack.caller;
 
-  var text = left + " == " + right;
-  if (left != right) {
-    do_throw(text, stack);
-  } else {
-    ++_passedChecks;
-    _dump("TEST-PASS | " + stack.filename + " | [" + stack.name + " : " +
-         stack.lineNumber + "] " + text + "\n");
-  }
+  _do_check_eq(left, right, stack, false);
+}
+
+function todo_check_eq(left, right, stack) {
+  if (!stack)
+      stack = Components.stack.caller;
+
+  _do_check_eq(left, right, stack, true);
 }
 
 function do_check_true(condition, stack) {
   if (!stack)
     stack = Components.stack.caller;
 
   do_check_eq(condition, true, stack);
 }
 
+function todo_check_true(condition, stack) {
+  if (!stack)
+    stack = Components.stack.caller;
+
+  todo_check_eq(condition, true, stack);
+}
+
 function do_check_false(condition, stack) {
   if (!stack)
     stack = Components.stack.caller;
 
   do_check_eq(condition, false, stack);
 }
 
+function todo_check_false(condition, stack) {
+  if (!stack)
+    stack = Components.stack.caller;
+
+  todo_check_eq(condition, false, stack);
+}
+
 function do_test_pending() {
   ++_tests_pending;
 
   _dump("TEST-INFO | (xpcshell/head.js) | test " + _tests_pending +
          " pending\n");
 }
 
 function do_test_finished() {