<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,17 +1,21 @@
 /* JSMock
  *
  * Usage:
- *  new Mock(Math, 'random', 1); =&gt; &lt;mock object&gt;
- *  Math.mock('random', 2, 3); =&gt; &lt;Math object&gt;
- *  Math.random(); =&gt; 3
- *  Math.random(); =&gt; 2
- *  Math.random(); =&gt; 1
- *  Math.random(); =&gt; actual random
+ *  new Mock(Math, 'random', 1);// =&gt; &lt;mock object&gt;
+ *  Mock.init(); // You need to init to run mock on objects like below
+ *  Math.mock('random', 2, 3);// =&gt; &lt;Math object&gt;
+ *  Math.random();// =&gt; 3
+ *  Math.random();// =&gt; 2
+ *  Math.random();// =&gt; 1
+ *  Math.random();// =&gt; actual random
  *
- *  Math.mock('random', 1, 2); =&gt; &lt;Math object&gt;
- *  Mock.reset(); // to clear all mocks
+ *  Math.mock('random', 1, 2);// =&gt; &lt;Math object&gt;
+ *  Mock.reset();// // to clear all mocks
  *  // or: Math.random.reset(); // to just clear the Math.random mock
- *  Math.random(); =&gt; actual random
+ *  Math.random();// =&gt; actual random
+ *
+ *  // use this to restore original Mock object (if you had one)
+ *  Mock.noFootprint();// =&gt; Mock
  *
  * Copyright (c) 2008 Douglas Meyer
  *
@@ -72,21 +76,21 @@
     }
     this.mocks = [];
   };
+  Mock.init = function(){
+    window.mock = Object.prototype.mock = function(){
+      var args=[ this ];
+      for(var index=0, arg;arg=arguments[index];index++){
+        args.push(arg);
+      }
+      var mock = Mock.apply(null, args);
+      return(this);
+    };
+  };
   Mock.noFootprint = function(){
     Object.prototype.mock = object_mock;
     window.mock = window_mock;
-    if (arguments.length &gt; 0) {
-      window.Mock = _Mock;
-    }
+    window.Mock = _Mock;
     return Mock;
   };
 
-  window.mock = Object.prototype.mock = function(){
-    var args=[ this ];
-    for(var index=0, arg;arg=arguments[index];index++){
-      args.push(arg);
-    }
-    var mock = Mock.apply(null, args);
-    return(this);
-  };
 })();</diff>
      <filename>src/mock.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,38 +1,27 @@
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005 Jon Tirsen (http://www.tirsen.com)
-//           (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// &quot;Software&quot;), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// script.aculo.us unittest.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
 
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
 
 // experimental, Firefox-only
 Event.simulateMouse = function(element, eventName) {
   var options = Object.extend({
     pointerX: 0,
     pointerY: 0,
-    buttons: 0
+    buttons:  0,
+    ctrlKey:  false,
+    altKey:   false,
+    shiftKey: false,
+    metaKey:  false
   }, arguments[2] || {});
   var oEvent = document.createEvent(&quot;MouseEvents&quot;);
   oEvent.initMouseEvent(eventName, true, true, document.defaultView, 
     options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 
-    false, false, false, false, 0, $(element));
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
   
   if(this.mark) Element.remove(this.mark);
   this.mark = document.createElement('div');
@@ -98,6 +87,7 @@ Test.Unit.Logger.prototype = {
     this.lastLogLine = document.createElement('tr');
     this.statusCell = document.createElement('td');
     this.nameCell = document.createElement('td');
+    this.nameCell.className = &quot;nameCell&quot;;
     this.nameCell.appendChild(document.createTextNode(testName));
     this.messageCell = document.createElement('td');
     this.lastLogLine.appendChild(this.statusCell);
@@ -110,6 +100,7 @@ Test.Unit.Logger.prototype = {
     this.lastLogLine.className = status;
     this.statusCell.innerHTML = status;
     this.messageCell.innerHTML = this._toHTML(summary);
+    this.addLinksToResults();
   },
   message: function(message) {
     if (!this.log) return;
@@ -131,6 +122,16 @@ Test.Unit.Logger.prototype = {
   },
   _toHTML: function(txt) {
     return txt.escapeHTML().replace(/\n/g,&quot;&lt;br/&gt;&quot;);
+  },
+  addLinksToResults: function(){ 
+    $$(&quot;tr.failed .nameCell&quot;).each( function(td){ // todo: limit to children of this.log
+      td.title = &quot;Run only this test&quot;
+      Event.observe(td, 'click', function(){ window.location.search = &quot;?tests=&quot; + td.innerHTML;});
+    });
+    $$(&quot;tr.passed .nameCell&quot;).each( function(td){ // todo: limit to children of this.log
+      td.title = &quot;Run all tests&quot;
+      Event.observe(td, 'click', function(){ window.location.search = &quot;&quot;;});
+    });
   }
 }
 
@@ -141,6 +142,7 @@ Test.Unit.Runner.prototype = {
       testLog: 'testlog'
     }, arguments[1] || {});
     this.options.resultsURL = this.parseResultsURLQueryParameter();
+    this.options.tests      = this.parseTestsQueryParameter();
     if (this.options.testLog) {
       this.options.testLog = $(this.options.testLog) || null;
     }
@@ -158,7 +160,11 @@ Test.Unit.Runner.prototype = {
         this.tests = [];
         for(var testcase in testcases) {
           if(/^test/.test(testcase)) {
-            this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases[&quot;setup&quot;], testcases[&quot;teardown&quot;]));
+            this.tests.push(
+               new Test.Unit.Testcase(
+                 this.options.context ? ' -&gt; ' + this.options.titles[testcase] : testcase, 
+                 testcases[testcase], testcases[&quot;setup&quot;], testcases[&quot;teardown&quot;]
+               ));
           }
         }
       }
@@ -170,6 +176,11 @@ Test.Unit.Runner.prototype = {
   parseResultsURLQueryParameter: function() {
     return window.location.search.parseQuery()[&quot;resultsURL&quot;];
   },
+  parseTestsQueryParameter: function(){
+    if (window.location.search.parseQuery()[&quot;tests&quot;]){
+        return window.location.search.parseQuery()[&quot;tests&quot;].split(',');
+    };
+  },
   // Returns:
   //  &quot;ERROR&quot; if there was an error,
   //  &quot;FAILURE&quot; if there was a failure, or
@@ -229,6 +240,7 @@ Test.Unit.Runner.prototype = {
       errors     +=   this.tests[i].errors;
     }
     return (
+      (this.options.context ? this.options.context + ': ': '') + 
       this.tests.length + &quot; tests, &quot; + 
       assertions + &quot; assertions, &quot; + 
       failures   + &quot; failures, &quot; +
@@ -283,6 +295,13 @@ Test.Unit.Assertions.prototype = {
         '&quot;, actual &quot;' + Test.Unit.inspect(actual) + '&quot;'); }
     catch(e) { this.error(e); }
   },
+  assertInspect: function(expected, actual) {
+    var message = arguments[2] || &quot;assertInspect&quot;;
+    try { (expected == actual.inspect()) ? this.pass() :
+      this.fail(message + ': expected &quot;' + Test.Unit.inspect(expected) + 
+        '&quot;, actual &quot;' + Test.Unit.inspect(actual) + '&quot;'); }
+    catch(e) { this.error(e); }
+  },
   assertEnumEqual: function(expected, actual) {
     var message = arguments[2] || &quot;assertEnumEqual&quot;;
     try { $A(expected).length == $A(actual).length &amp;&amp; 
@@ -297,12 +316,33 @@ Test.Unit.Assertions.prototype = {
       this.fail(message + ': got &quot;' + Test.Unit.inspect(actual) + '&quot;'); }
     catch(e) { this.error(e); }
   },
+  assertIdentical: function(expected, actual) { 
+    var message = arguments[2] || &quot;assertIdentical&quot;; 
+    try { (expected === actual) ? this.pass() : 
+      this.fail(message + ': expected &quot;' + Test.Unit.inspect(expected) +  
+        '&quot;, actual &quot;' + Test.Unit.inspect(actual) + '&quot;'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNotIdentical: function(expected, actual) { 
+    var message = arguments[2] || &quot;assertNotIdentical&quot;; 
+    try { !(expected === actual) ? this.pass() : 
+      this.fail(message + ': expected &quot;' + Test.Unit.inspect(expected) +  
+        '&quot;, actual &quot;' + Test.Unit.inspect(actual) + '&quot;'); } 
+    catch(e) { this.error(e); } 
+  },
   assertNull: function(obj) {
     var message = arguments[1] || 'assertNull'
     try { (obj==null) ? this.pass() : 
       this.fail(message + ': got &quot;' + Test.Unit.inspect(obj) + '&quot;'); }
     catch(e) { this.error(e); }
   },
+  assertMatch: function(expected, actual) {
+    var message = arguments[2] || 'assertMatch';
+    var regex = new RegExp(expected);
+    try { (regex.exec(actual)) ? this.pass() :
+      this.fail(message + ' : regex: &quot;' +  Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '&quot;'); }
+    catch(e) { this.error(e); }
+  },
   assertHidden: function(element) {
     var message = arguments[1] || 'assertHidden';
     this.assertEqual(&quot;none&quot;, element.style.display, message);
@@ -311,6 +351,22 @@ Test.Unit.Assertions.prototype = {
     var message = arguments[1] || 'assertNotNull';
     this.assert(object != null, message);
   },
+  assertType: function(expected, actual) {
+    var message = arguments[2] || 'assertType';
+    try { 
+      (actual.constructor == expected) ? this.pass() : 
+      this.fail(message + ': expected &quot;' + Test.Unit.inspect(expected) +  
+        '&quot;, actual &quot;' + (actual.constructor) + '&quot;'); }
+    catch(e) { this.error(e); }
+  },
+  assertNotOfType: function(expected, actual) {
+    var message = arguments[2] || 'assertNotOfType';
+    try { 
+      (actual.constructor != expected) ? this.pass() : 
+      this.fail(message + ': expected &quot;' + Test.Unit.inspect(expected) +  
+        '&quot;, actual &quot;' + (actual.constructor) + '&quot;'); }
+    catch(e) { this.error(e); }
+  },
   assertInstanceOf: function(expected, actual) {
     var message = arguments[2] || 'assertInstanceOf';
     try { 
@@ -325,6 +381,63 @@ Test.Unit.Assertions.prototype = {
       this.fail(message + &quot;: object was an instance of the not expected type&quot;); }
     catch(e) { this.error(e); } 
   },
+  assertRespondsTo: function(method, obj) {
+    var message = arguments[2] || 'assertRespondsTo';
+    try {
+      (obj[method] &amp;&amp; typeof obj[method] == 'function') ? this.pass() : 
+      this.fail(message + &quot;: object doesn't respond to [&quot; + method + &quot;]&quot;); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsTrue: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsTrue';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      m() ? this.pass() : 
+      this.fail(message + &quot;: method returned false&quot;); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsFalse: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsFalse';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      !m() ? this.pass() : 
+      this.fail(message + &quot;: method returned true&quot;); }
+    catch(e) { this.error(e); }
+  },
+  assertRaise: function(exceptionName, method) {
+    var message = arguments[2] || 'assertRaise';
+    try { 
+      method();
+      this.fail(message + &quot;: exception expected but none was raised&quot;); }
+    catch(e) {
+      ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); 
+    }
+  },
+  assertElementsMatch: function() {
+    var expressions = $A(arguments), elements = $A(expressions.shift());
+    if (elements.length != expressions.length) {
+      this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+      return false;
+    }
+    elements.zip(expressions).all(function(pair, index) {
+      var element = $(pair.first()), expression = pair.last();
+      if (element.match(expression)) return true;
+      this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+    }.bind(this)) &amp;&amp; this.pass();
+  },
+  assertElementMatches: function(element, expression) {
+    this.assertElementsMatch([element], expression);
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  },
   _isVisible: function(element) {
     element = $(element);
     if(!element.parentNode) return true;
@@ -355,7 +468,17 @@ Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.p
   initialize: function(name, test, setup, teardown) {
     Test.Unit.Assertions.prototype.initialize.bind(this)();
     this.name           = name;
-    this.test           = test || function() {};
+    
+    if(typeof test == 'string') {
+      test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+      test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+      this.test = function() {
+        eval('with(this){'+test+'}');
+      }
+    } else {
+      this.test = test || function() {};
+    }
+    
     this.setup          = setup || function() {};
     this.teardown       = teardown || function() {};
     this.isWaiting      = false;
@@ -381,3 +504,65 @@ Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.p
     catch(e) { this.error(e); }
   }
 });
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+  var METHODMAP = {
+    shouldEqual:     'assertEqual',
+    shouldNotEqual:  'assertNotEqual',
+    shouldEqualEnum: 'assertEnumEqual',
+    shouldBeA:       'assertType',
+    shouldNotBeA:    'assertNotOfType',
+    shouldBeAn:      'assertType',
+    shouldNotBeAn:   'assertNotOfType',
+    shouldBeNull:    'assertNull',
+    shouldNotBeNull: 'assertNotNull',
+    
+    shouldBe:        'assertReturnsTrue',
+    shouldNotBe:     'assertReturnsFalse',
+    shouldRespondTo: 'assertRespondsTo'
+  };
+  var makeAssertion = function(assertion, args, object) { 
+   	this[assertion].apply(this,(args || []).concat([object]));
+  }
+  
+  Test.BDDMethods = {};   
+  $H(METHODMAP).each(function(pair) { 
+    Test.BDDMethods[pair.key] = function() { 
+       var args = $A(arguments); 
+       var scope = args.shift(); 
+       makeAssertion.apply(scope, [pair.value, args, this]); }; 
+  });
+  
+  [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
+    function(p){ Object.extend(p, Test.BDDMethods) }
+  );
+}
+
+Test.context = function(name, spec, log){
+  Test.setupBDDExtensionMethods();
+  
+  var compiledSpec = {};
+  var titles = {};
+  for(specName in spec) {
+    switch(specName){
+      case &quot;setup&quot;:
+      case &quot;teardown&quot;:
+        compiledSpec[specName] = spec[specName];
+        break;
+      default:
+        var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+        var body = spec[specName].toString().split('\n').slice(1);
+        if(/^\{/.test(body[0])) body = body.slice(1);
+        body.pop();
+        body = body.map(function(statement){ 
+          return statement.strip()
+        });
+        compiledSpec[testName] = body.join('\n');
+        titles[testName] = specName;
+    }
+  }
+  new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+};
\ No newline at end of file</diff>
      <filename>tests/lib/unittest.js</filename>
    </modified>
    <modified>
      <diff>@@ -26,69 +26,63 @@
 &lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; charset=&quot;utf-8&quot;&gt;
 // &lt;![CDATA[
 
+  var originalMock = window.Mock;
+
   new Test.Unit.Runner({
 
     setup: function() { with(this) {
+      try{ originalMock.noFootprint(true); }catch(e){ window.status += 'noFootprint broke'+e+&quot;|&quot;; }
+      window.Mock = originalMock;
       initialRandom = Math.random;
       initialRound = Math.round;
       initialSetTimeout = window.setTimeout;
     }},
 
     teardown: function() { with(this) {
+      try{ originalMock.reset(); }catch(e){ window.status += 'reset broke'+e+&quot;|&quot; }
       window.setTimeout = initialSetTimeout;
       Math.round = initialRound;
       Math.random = initialRandom;
     }},
 
-    testObjectMock_MakesTheNextCallReturnWhatYouPassed: function() { with(this) {
-      Math.mock('random', 3);
+    testMockObject_MakesTheNextCallReturnWhatYouPassed: function() { with(this) {
+      new Mock(Math, 'random', 3);
 
       assertEqual(3, Math.random());
     }},
 
-    testObjectMock_RemovesMockAfterItIsCalled: function(){with(this){
-      Math.mock('random', 3);
+    testMockObject_RemovesMockAfterItIsCalled: function(){with(this){
+      new Mock(Math, 'random', 3);
 
       Math.random();
       assertEqual(initialRandom, Math.random);
     }},
 
-    testObjectMock_GetsExecutedLikeAStack: function(){with(this){
-      Math.mock('random', 3);
-      Math.mock('random', 4);
+    testMockObject_GetsExecutedLikeAStack: function(){with(this){
+      new Mock(Math, 'random', 3);
+      new Mock(Math, 'random', 4);
 
       assertEqual(4, Math.random());
       assertEqual(3, Math.random());
     }},
 
-    testObjectMockWithMultipleArguments_GetsAddedLikeAStack: function(){with(this){
-      Math.mock('random', 3, 4);
+    testMockObjectWithMultipleArguments_GetsAddedLikeAStack: function(){with(this){
+      new Mock(Math, 'random', 3, 4);
 
       assertEqual(4, Math.random());
       assertEqual(3, Math.random());
     }},
 
-    testObjectMocks_CanBeChained: function(){with(this){
-      var initialRound = Math.round;
-
-      Math.mock('random', 3).mock('round', 4);
-
-      assertEqual(3, Math.random());
-      assertEqual(4, Math.round());
-      assertEqual(initialRandom, Math.random);
-      assertEqual(initialRound, Math.round);
-    }},
-
-    testObjectMock_WillCallFunctionIfFunctionPassed: function(){with(this){
-      Math.mock('random', function(arg){ return(arg+1); });
+    testMockObject_WillCallFunctionIfFunctionPassed: function(){with(this){
+      new Mock(Math, 'random', function(arg){ return(arg+1); });
 
       assertEqual(101, Math.random(100));
     }},
 
-    testObjectMockReset_WillClearAllMocksLeavingTheDefaultFunction: function(){with(this){
+    testMockObjectReset_WillClearAllMocksLeavingTheDefaultFunction: function(){with(this){
       var initialRandom = Math.random;
-      Math.mock('random', 3, 4, 5);
-      Math.mock('random', 6, 7);
+      new Mock(Math, 'random', 3, 4, 5);
+      new Mock(Math, 'random', 6, 7);
       assertEqual(7, Math.random());
       Math.random.reset();
       assertEqual(initialRandom, Math.random);
@@ -96,8 +90,8 @@
 
     testMockReset_WillClearAllMocks: function(){with(this){
       var initialRandom = Math.random, initialSetTimeout = window.setTimeout;
-      Math.mock('random', 3);
-      window.mock('setTimeout', 8);
+      new Mock(Math, 'random', 3);
+      new Mock(window, 'setTimeout', 8);
 
       Mock.reset();
 
@@ -123,27 +117,42 @@
       assertEqual(initialSetTimeout, window.setTimeout);
     }},
 
-    testWindow_AlsoGetsMocked: function(){with(this){
+    testMockInit_MocksWindow: function(){with(this){
+      assertEqual(undefined, window.mock);
+      Mock.init();
       assert(window.mock);
     }},
 
-    testMockNoFootprint_WillRemoveMethodsFromObjects: function(){with(this){
+    testMockInit_MocksObjects: function(){with(this){
+      assertEqual(undefined, Math.mock);
+      Mock.init();
+      Math.mock('random', 1,2,3);
+
+      assertEqual(3, Math.random());
+      assertEqual(2, Math.random());
+    }},
+
+    testObjectMocks_CanBeChained: function(){with(this){
+      Mock.init();
+      var initialRound = Math.round;
+
+      Math.mock('random', 3).mock('round', 4);
+
+      assertEqual(3, Math.random());
+      assertEqual(4, Math.round());
+      assertEqual(initialRandom, Math.random);
+      assertEqual(initialRound, Math.round);
+    }},
+
+    testMockNoFootprint_WillRestoreOldMock: function(){with(this){
       Mock.noFootprint();
-      assertEqual(undefined, {}.mock);
-      assertEqual(undefined, (function(){}).mock);
+      assertEqual(undefined, window.Mock);
     }},
 
     testMockNoFootprint_ReturnsMockObject: function(){with(this){
-      var mockObject = Mock;
+      var mockObject = window.Mock;
       var returned = Mock.noFootprint();
       assertEqual(mockObject, returned);
-    }},
-
-    testMockNoFootprintWithArgument_WillRestoreOldMock: function(){with(this){
-      var mockObject = Mock.noFootprint();
-      assertEqual(mockObject, window.Mock);
-      Mock.noFootprint(true);
-      assertEqual(undefined, window.Mock);
     }}
 
   }, &quot;testlog&quot;);</diff>
      <filename>tests/mock_test.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>56e4f43972f92e0307f77a202b367fdc58998884</id>
    </parent>
  </parents>
  <author>
    <name>Douglas Meyer</name>
    <email>douglas.meyer@centro.net</email>
  </author>
  <url>http://github.com/DouglasMeyer/jsmock/commit/ba79fc7c09e03c85931976cdd71eb30402a3b5c5</url>
  <id>ba79fc7c09e03c85931976cdd71eb30402a3b5c5</id>
  <committed-date>2008-08-26T08:02:56-07:00</committed-date>
  <authored-date>2008-08-25T15:46:06-07:00</authored-date>
  <message>Mocking objects requires you to init first.
Updated the test library.
Updated the examples.</message>
  <tree>4e49b7e2c7796a00ee234ea843a2380106590588</tree>
  <committer>
    <name>Douglas Meyer</name>
    <email>douglas.meyer@centro.net</email>
  </committer>
</commit>
