<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,9 +1,41 @@
-This fork adds asynchronous testing:
+# Skipping Tests:
+
+* Skipped has a separate status counter at the top of the page, a new display color, and a reason can be printed to the page.
+* At any time within an test, you can make it show as skipped.  The test will cease to run at that point.  It can no longer pass or fail.
+* If you want to skip multiple tests, the before can do the skip.
+
+Examples:
+          it('should be skipped if the browser is IE', function(me){
+            if(this_browser_is_IE){
+              skip(me).because('IE doesn't have some function I am testing, and failed tests make me curl up on the floor and cry');
+            }
+          })
+          
+          describe('', function(){
+           before(function(me){
+             if(this_browser_is_IE){
+               skip(me).because('IE doesn't have some function I am testing, and failed tests make me curl up on the floor and cry');
+             }
+           });
+           
+           it('will never run at all', function(){
+             alert('you won't see this');
+           }); 
+           
+           it('will never _ever_ run at all', function(){
+             alert('you won't see this... ever!');
+           }); 
+           
+          })
+
+
+# Asynchronous testing:
+
 * A jQuery object representing the current test's dom element is now passed to &quot;it&quot; functions
 * Asynchronous testing functions are tracked and displayed with overall status, which updates as tests complete
 * Nested asynchronous testing
 
-    examples:
+Examples:
         it('tests something after 3 seconds', function(me){
           var x = false;
           setTimeout(some_magic_function, 1000);
@@ -19,13 +51,14 @@ This fork adds asynchronous testing:
             expect(x).to(be_true);
             setTimeout(some_other_magic_function, 1000);
             using(me).wait(3).and_then(function(){
-              expect(x).to(be_true);
+              expect(x).to(be_false);
             });
           });
         })
 
 
-This fork adds mocking support for your javascript tests
+# Mocking
+
 * Mock out objects (and have them restored at the next test)
 * insert DOM mocks for each test
 * Mock out Prototype.js AJAX calls using a simple interface
@@ -33,7 +66,7 @@ This fork adds mocking support for your javascript tests
 
 Docs online at:  [http://toppingdesign.com/mock_docs/](http://toppingdesign.com/mock_docs/)
     
-    examples:
+Examples:
         // DOM mocking
         TH.insertDomMock(&quot;some_mock&quot;); // will insert dom_mocks/some_mock.html into &lt;div id=&quot;dom_test&quot;&gt;&lt;/div&gt;
         </diff>
      <filename>README.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,10 @@ Screw.Defaults.to_run = 'body &gt; .describe &gt; .describes &gt; .describe';
     $('.status').fn({
       display: function() {
         $(this).text(
-          $('.passed').length + $('.failed').length + ' finished, ' + $('.failed').length + ' failure(s), ' + $('.async').length + ' running asynchronous test(s)'
+          $('.it.passed' ).length + $('.failed').length + $('.skipped').length + ' finished, ' +
+          $('.it.failed' ).length + ' failure(s), ' + 
+          $('.it.skipped').length + ' skipped, ' + 
+          $('.it.async'  ).length + ' running asynchronous test(s)'
         );
       }
     });
@@ -47,6 +50,8 @@ Screw.Defaults.to_run = 'body &gt; .describe &gt; .describes &gt; .describe';
       },
       
       run: function() {
+        if ($(this).hasClass('skipped')){return}
+        
         try {
           try {
             $(this).fn('parent').fn('run_befores');
@@ -76,11 +81,11 @@ Screw.Defaults.to_run = 'body &gt; .describe &gt; .describes &gt; .describe';
     });
     
     $('.before').fn({
-      run: function() { $(this).data('screwunit.run')() }
+      run: function() { $(this).data('screwunit.run')($(this)) }
     }); 
   
     $('.after').fn({
-      run: function() { $(this).data('screwunit.run')() }
+      run: function() { $(this).data('screwunit.run')($(this)) }
     });
 
     $(Screw).trigger('before');</diff>
      <filename>lib/screw.behaviors.js</filename>
    </modified>
    <modified>
      <diff>@@ -2,23 +2,33 @@ var Screw = (function($) {
   var screw = {
     Unit: function(fn) {
       var contents = fn.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1];
-      var fn = new Function(&quot;matchers&quot;, &quot;specifications&quot;, &quot;asynchronous&quot;,
-        &quot;with (specifications) { with (matchers) { with (asynchronous) {&quot; + contents + &quot; } } }&quot;
+      var fn = new Function(&quot;matchers&quot;, &quot;specifications&quot;, &quot;utilities&quot;,
+        &quot;with (specifications) { with (matchers) { with (utilities) {&quot; + contents + &quot; } } }&quot;
       );
 
       $(Screw).queue(function() {
         Screw.Specifications.context.push($('body &gt; .describe'));
-        fn.call(this, Screw.Matchers, Screw.Specifications, Screw.Asynchronous);
+        fn.call(this, Screw.Matchers, Screw.Specifications, Screw.Utilities);
         Screw.Specifications.context.pop();
         $(this).dequeue();
       });
     },
 
-    Asynchronous: {
+    Utilities: {
       /*
        * 'me' is $(this) being passed to the screwunit.run function (see screw.behaviors.js)
        *   $(this).data('screwunit.run')($(this));
        */
+       
+      skip: function(me){
+        return {
+          because: function(reason) {
+            me.trigger('skipped', [reason]);
+            throw '';
+          }
+        }
+      },
+      
       using: function( me ) {
         return {
           wait : function( seconds ) {
@@ -41,7 +51,7 @@ var Screw = (function($) {
                 };
 
                 var async_count = me.data('async_waiting_count') ||  0
-                me.data('async_waiting_count', async_count+1)
+                me.data('async_waiting_count', async_count + 1)
 
                 me.addClass('async');
 </diff>
      <filename>lib/screw.builder.js</filename>
    </modified>
    <modified>
      <diff>@@ -87,4 +87,16 @@ html {
             cursor: pointer;
             color: #000 !important;
             border-bottom: 1px solid #9A8E51;
-          }
\ No newline at end of file
+          }
+          
+          
+          .describes .describe .its .it.skipped h2 {
+            background-color: #8DEEEE;
+            color: #000000 !important;
+          }
+
+          .describes .describe .its .it.skipped p {
+            margin-left: 1em;
+            color: #000000;
+          }
+          
\ No newline at end of file</diff>
      <filename>lib/screw.css</filename>
    </modified>
    <modified>
      <diff>@@ -26,12 +26,14 @@
             .removeClass('passed');
         })
         .bind('passed', function() {
+          if ($(this).hasClass('skipped')){return}
           $(this)
             .addClass('passed')
             .removeClass('failed');
           $('.status').fn('display');
         })
         .bind('failed', function(e, reason) {
+          if ($(this).hasClass('skipped')){return}          
           reason = reason || '';
           $(this)
             .addClass('failed')
@@ -43,6 +45,25 @@
               .append($('&lt;p class=&quot;error&quot;&gt;&lt;/p&gt;').text(reason.fileName + &quot; : &quot; + reason.lineNumber));
           }
         })
+        .bind('skipped', function(e, reason) {
+          $(this)
+            .removeClass('failed')
+            .removeClass('passed')
+            .addClass('skipped')
+            .append($('&lt;p class=&quot;skip_reason&quot;&gt;&lt;/p&gt;').text(&quot;Skipped because: &quot; + reason.toString()));
+          $('.status').fn('display');
+        });
+        
+      $('.before')
+        .bind('skipped', function(e, reason){
+          if ($(this).hasClass('skipped')){ return }
+          $(this)
+            .addClass('skipped')
+            .append($('&lt;p class=&quot;skip_reason&quot;&gt;&lt;/p&gt;').text(&quot;Group Skipped because: &quot; + reason.toString()));
+          $('.it', $(this).parent().parent().get(0))
+            .addClass('skipped');
+          $('.status').fn('display');
+        });
     })
     .bind('before', function() {
       $('.status').text('Starting...');</diff>
      <filename>lib/screw.events.js</filename>
    </modified>
    <modified>
      <diff>@@ -15,6 +15,7 @@
     &lt;script src=&quot;print_spec.js&quot;&gt;&lt;/script&gt;
     &lt;script src=&quot;mock_spec.js&quot;&gt;&lt;/script&gt;
     &lt;script src=&quot;asynchronous_spec.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;skipping_spec.js&quot;&gt;&lt;/script&gt;
 
     &lt;link rel=&quot;stylesheet&quot; href=&quot;../lib/screw.css&quot;&gt;
   &lt;/head&gt;</diff>
      <filename>spec/suite.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0d30a5dce2007857d55b5140b9700346f8c6c684</id>
    </parent>
  </parents>
  <author>
    <name>Raymond Cohen</name>
    <email>ray@raymond-cohens-macbook-pro.local</email>
  </author>
  <url>http://github.com/tobowers/screw-unit/commit/3ddafb86ece4bae7f5e111fa7cc38311fd21ffb4</url>
  <id>3ddafb86ece4bae7f5e111fa7cc38311fd21ffb4</id>
  <committed-date>2008-08-12T13:55:47-07:00</committed-date>
  <authored-date>2008-08-12T13:55:47-07:00</authored-date>
  <message>Adding test-skipping functionality, part 2</message>
  <tree>d2ee1e2bc7cfc2e36feec5367827c5e5c01f864a</tree>
  <committer>
    <name>Raymond Cohen</name>
    <email>ray@raymond-cohens-macbook-pro.local</email>
  </committer>
</commit>
