<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Dark Views &#187; JUnit</title>
	<atom:link href="http://blog.pdark.de/tag/junit/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pdark.de</link>
	<description>Opinions and views about computers, writing SciFi and everything else.</description>
	<lastBuildDate>Wed, 08 Feb 2012 06:43:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.pdark.de' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/7741f06d762e6a53700b2915f21e3d77?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Dark Views &#187; JUnit</title>
		<link>http://blog.pdark.de</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.pdark.de/osd.xml" title="Dark Views" />
	<atom:link rel='hub' href='http://blog.pdark.de/?pushpress=hub'/>
		<item>
		<title>Useful JUnit Helper Method: ignoreUntil()</title>
		<link>http://blog.pdark.de/2011/08/16/useful-junit-helper-method-ignoreuntil/</link>
		<comments>http://blog.pdark.de/2011/08/16/useful-junit-helper-method-ignoreuntil/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 07:36:28 +0000</pubDate>
		<dc:creator>digulla</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JUnit]]></category>

		<guid isPermaLink="false">http://blog.pdark.de/?p=2263</guid>
		<description><![CDATA[We all know the pattern: A test fails but you can&#8217;t fix it right away. What do you do? Let it stay red? @Ignore it? All those approaches have drawbacks. Red tests make me nervous. But when I add an @Ignore, I sometimes forget to remove it in a timely fashion. Enter stage ignoreUntil(): Usage: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=2263&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We all know the pattern: A test fails but you can&#8217;t fix it right away. What do you do? Let it stay red? @Ignore it?</p>
<p>All those approaches have drawbacks. Red tests make me nervous. But when I add an @Ignore, I sometimes forget to remove it in a timely fashion. Enter stage <tt>ignoreUntil()</tt>:</p>
<p><pre class="brush: java;">
/**
 * Ignore a test until a certain date.
 *
 * &lt;p&gt;This method will make the test silently fail
 * (as if it had been ignored) until a certain
 * date.
 *
 * &lt;p&gt;For documentation purposes, you can give a
 * message that explains why it's ignored.
 */
public static void ignoreUntil(
    String date_YYYY_MM_DD,
    String message
) {
    Date date;
    SimpleDateFormat format
        = new SimpleDateFormat( &quot;yyyy-MM-dd&quot; );
    try {
        date = format.parse( date_YYYY_MM_DD );
    } catch( ParseException e ) {
        throw new RuntimeException(
            &quot;Can't parse date [&quot; 
            + date_YYYY_MM_DD
            + &quot;] using format &quot;
            + format.toPattern()
        );
    }
    Assume.assumeTrue( new Date().after( date ) );
}
</pre></p>
<p>Usage:</p>
<p><pre class="brush: java;">
@Test
public void someTest() throws Exception {
    ignoreUntil( &quot;2011-09-15&quot;, &quot;See issue #78&quot; );
}
</pre></p>
<p>Happy testing!</p>
<br /> Tagged: <a href='http://blog.pdark.de/tag/java/'>Java</a>, <a href='http://blog.pdark.de/tag/junit/'>JUnit</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/darkviews.wordpress.com/2263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/darkviews.wordpress.com/2263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/darkviews.wordpress.com/2263/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=2263&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.pdark.de/2011/08/16/useful-junit-helper-method-ignoreuntil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a4d6f03a8879432d8563aefbf48e787?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">digulla</media:title>
		</media:content>
	</item>
		<item>
		<title>Hidden JUnit features: @Rules</title>
		<link>http://blog.pdark.de/2010/10/08/hidden-junit-features-rules/</link>
		<comments>http://blog.pdark.de/2010/10/08/hidden-junit-features-rules/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 18:16:00 +0000</pubDate>
		<dc:creator>digulla</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Development Tools]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tests]]></category>
		<category><![CDATA[Unit testing]]></category>

		<guid isPermaLink="false">http://blog.pdark.de/?p=1381</guid>
		<description><![CDATA[@Rules seem a better solution than @RunWith to do some special work before/after a test. The release notes mention a couple of ideas: Notification on tests Setting up or tearing down resources, especially when they are used in multiple test classes Special checks performed after every test, possibly causing a test to fail. Making information [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=1381&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><code>@Rules</code> seem a better solution than <code>@RunWith</code> to do some special work before/after a test. The <a href="http://github.com/KentBeck/junit/raw/23ffc6baf5768057e366e183e53f4dfa86fbb005/doc/ReleaseNotes4.7.txt">release notes</a> mention a couple of ideas:</p>
<ul>
<li> Notification on tests</li>
<li>Setting up or tearing down resources, especially when they are used in multiple test classes</li>
<li>Special checks performed after every test, possibly causing a test to fail.</li>
<li>Making information about the test available inside the test</li>
</ul>
<p>Related articles:</p>
<ul>
<li><a title="New Feature of JUnit: Rules" href="http://blog.schauderhaft.de/2009/10/04/junit-rules/">New Feature of JUnit: Rules</a></li>
</ul>
<br /> Tagged: <a href='http://blog.pdark.de/tag/development-tools/'>Development Tools</a>, <a href='http://blog.pdark.de/tag/java/'>Java</a>, <a href='http://blog.pdark.de/tag/junit/'>JUnit</a>, <a href='http://blog.pdark.de/tag/programming/'>Programming</a>, <a href='http://blog.pdark.de/tag/tests/'>Tests</a>, <a href='http://blog.pdark.de/tag/unit-testing/'>Unit testing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/darkviews.wordpress.com/1381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/darkviews.wordpress.com/1381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/darkviews.wordpress.com/1381/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=1381&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.pdark.de/2010/10/08/hidden-junit-features-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a4d6f03a8879432d8563aefbf48e787?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">digulla</media:title>
		</media:content>
	</item>
		<item>
		<title>Testing The Impossible: Inserting Into Database</title>
		<link>http://blog.pdark.de/2009/06/05/testing-the-impossible-inserting-into-database/</link>
		<comments>http://blog.pdark.de/2009/06/05/testing-the-impossible-inserting-into-database/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 18:34:23 +0000</pubDate>
		<dc:creator>digulla</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.pdark.de/?p=626</guid>
		<description><![CDATA[Tests run slow when you need a database. An in-memory database like HSQLDB or Derby helps but at a cost: Your real database will accept some SQL which your test database won&#8217;t. So the question is: How can you write a performant test which uses the SQL of the real database? My solution is to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=626&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Tests run slow when you need a database. An in-memory database like <a href="http://hsqldb.org/">HSQLDB</a> or <a href="http://db.apache.org/derby/">Derby</a> helps but at a cost: Your real database will accept some SQL which your test database won&#8217;t. So the question is: How can you write a performant test which uses the SQL of the real database?</p>
<p>My solution is to wrap the JDBC layer. Either use a mock JDBC interface like the one provided by <a href="http://mockrunner.sourceforge.net/">mockrunner</a>. Or write your own. With Java 5 and varargs, this is simple:</p>
<p><pre class="brush: java;">
public int update (Connection conn, String sql, Object... params) throws SQLException {
    PreparedStatement stmt = null;
    try {
        stmt = conn.prepareStatement (sql);
        int i = 1;
        for (Object p: params) {
            stmt.setObject(i++, p);
        }
        return stmt.executeUpdate ();
    }
    finally {
        stmt.close ();
    }
}
</pre></p>
<p>Put all these methods into an object that you can pass around. In your tests, override this object with a mockup that simply collects the SQL strings and parameter arrays. You can even mix and match: By examining the SQL string, you can decide whether you want to run a query against the database or handle it internally.</p>
<p>This way, you can collect any newly created objects but still load some background data from the database (until you get bored and make the query methods return predefined results).</p>
<p>In the asserts, just collect all the results into a big String and <a href="http://blog.pdark.de/2009/03/23/testing-the-impossible-asserting-several-values/">compare them all at once</a>.</p>
<p>Notes: The code above is a bit more complicated if you allow <tt>null</tt> values. In this case, you need to tell JDBC what the column type is. My solution is a <tt>NullParameter</tt> class which contains the type. If the loop encounters this class, then it calls <tt>setNull()</tt> instead of <tt>setObject()</tt>.</p>
<br /> Tagged: Database, JUnit, TDD, Testing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/darkviews.wordpress.com/626/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/darkviews.wordpress.com/626/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/darkviews.wordpress.com/626/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=626&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.pdark.de/2009/06/05/testing-the-impossible-inserting-into-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a4d6f03a8879432d8563aefbf48e787?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">digulla</media:title>
		</media:content>
	</item>
		<item>
		<title>Testing the Impossible: JavaScript in a Web Page</title>
		<link>http://blog.pdark.de/2008/11/18/testing-the-impossible-javascript-in-a-web-page/</link>
		<comments>http://blog.pdark.de/2008/11/18/testing-the-impossible-javascript-in-a-web-page/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 10:15:00 +0000</pubDate>
		<dc:creator>digulla</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://darkviews.wordpress.com/2008/11/18/testing-the-impossible-javascript-in-a-web-page/</guid>
		<description><![CDATA[How do you run JUnit tests on JavaScript in a web page? Impossible? Here is what you need: First, get a copy of Rhino (at least 1.6R7). Then, save a copy of the JavaScript code at the bottom as &#8220;env.js&#8220;. And here is the setup code for the JUnit test: This will load &#8220;demo.html&#8221; into [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=164&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>How do you run JUnit tests on JavaScript in a web page? Impossible?</p>
<p>Here is what you need: First, get a copy of <a href="http://www.mozilla.org/rhino/">Rhino</a> (at least 1.6R7). Then, save a copy of the JavaScript code at the bottom as &#8220;<tt>env.js</tt>&#8220;. And here is the setup code for the <a href="http://www.junit.org/">JUnit test</a>:</p>
<p><pre class="brush: java;">
    Context cx;
    Global scope;

    public void setupContext () throws IllegalAccessException,
            InstantiationException, InvocationTargetException
    {
        cx = Context.enter();
        scope = new Global();
        scope.init (cx);

        addScript(cx, scope, new File (&quot;html/env.js&quot;));

        File f = new File (&quot;html/demo.html&quot;);
        cx.evaluateString(scope, 
                &quot;window.location = '&quot;+f.toURL()+&quot;';\n&quot;
                + &quot;&quot;, &quot;setupContext&quot;, 1, null);
    }

    public void addScript (Context cx, Scriptable scope, File file) throws IOException
    {
        Reader in = new FileReader (file);
        cx.evaluateReader(scope, in, file.getAbsolutePath(), 1, null);
    }
</pre></p>
<p>This will load &#8220;demo.html&#8221; into the browser simulation. The problem here: The loading is asynchronous (just like in a real browser). Now what? We need synchronization:</p>
<div style="width:100%;height:30em;overflow:scroll;">
<pre class="brush: java;">
import org.mozilla.javascript.ScriptableObject;

public class JSJSynchronize extends ScriptableObject
{
    public Object data;
    public Object lock = new Object ();
    
    public JSJSynchronize()
    {
    }
    
    @Override
    public String getClassName ()
    {
        return &quot;JSJSynchronize&quot;;
    }
    
    public Object jsGet_data()
    {
        synchronized (lock)
        {
            try
            {
                lock.wait ();
            }
            catch (InterruptedException e)
            {
                throw new RuntimeException (&quot;Should not happen&quot;, e);
            }
            
            return data;
        }
    }

    public void jsSet_data(Object data)
    {
        synchronized (lock)
        {
            this.data = data;
            lock.notify ();
        }
    }
    
    public Object getData()
    {
        synchronized (lock)
        {
            try
            {
                lock.wait ();
            }
            catch (InterruptedException e)
            {
                throw new RuntimeException (&quot;Should not happen&quot;, e);
            }
            
            return data;
        }
    }

    public void setData(Object data)
    {
        synchronized (lock)
        {
            this.data = data;
            lock.notify ();
        }
    }
    
}
</pre>
</div>
<p>With this code and &#8220;window.onload&#8221;, we can wait for the html to load:</p>
<p><pre class="brush: java;">
        JSJSynchronize jsjSynchronize;
        ScriptableObject.defineClass(scope, JSJSynchronize.class);
        
        jsjSynchronize = (JSJSynchronize)cx.newObject (scope, &quot;JSJSynchronize&quot;);
        scope.put(&quot;jsjSynchronize&quot;, scope, jsjSynchronize);

        cx.evaluateString(scope, 
                &quot;window.location = '&quot;+f.toURL()+&quot;';\n&quot; +
                &quot;window.onload = function(){\n&quot; +
                &quot;    print('Window loaded');\n&quot; +
                &quot;    jsjSynchronize.data = window;\n&quot; +
                &quot;};\n&quot; +
                &quot;&quot;, &quot;&quot;, 1, null);

        ScriptableObject window = (ScriptableObject)jsjSynchronize.getData();
        System.out.println (&quot;window=&quot;+window);
        ScriptableObject document = (ScriptableObject)scope.get (&quot;document&quot;, scope);
        System.out.println (&quot;document=&quot;+document);
        System.out.println (&quot;document.forms=&quot;+document.get (&quot;forms&quot;, document));
        ScriptableObject navigator = (ScriptableObject)scope.get (&quot;navigator&quot;, scope);
        System.out.println (&quot;navigator=&quot;+navigator);
        System.out.println (&quot;navigator.location=&quot;+navigator.get (&quot;location&quot;, navigator));

        // I've been too lazy to parse the HTML for the scripts:
        addScript(cx, scope, new File (&quot;src/main/webapp/script/prototype.js&quot;));
</pre></p>
<p>Slightly modified version of env.js, original by John Resig (<a href="http://jqueryjs.googlecode.com/svn/trunk/jquery/build/runtest/env.js">original code</a>):</p>
<div style="width:100%;height:30em;overflow:scroll;">
<pre class="brush: jscript;">
/*
 * Simulated browser environment for Rhino
 *   By John Resig &amp;lt;http://ejohn.org/&amp;gt;
 * Copyright 2007 John Resig, under the MIT License
 * http://jqueryjs.googlecode.com/svn/trunk/jquery/build/runtest/
 * Revision 5251
 */

// The window Object
var window = this;

// generic enumeration
Function.prototype.forEach = function(object, block, context) {
 for (var key in object) {
  if (typeof this.prototype[key] == &quot;undefined&quot;) {
   block.call(context, object[key], key, object);
  }
 }
};

// globally resolve forEach enumeration
var forEach = function(object, block, context) {
 if (object) {
  var resolve = Object; // default
  if (object instanceof Function) {
   // functions have a &quot;length&quot; property
   resolve = Function;
  } else if (object.forEach instanceof Function) {
   // the object implements a custom forEach method so use that
   object.forEach(block, context);
   return;
  } else if (typeof object.length == &quot;number&quot;) {
   // the object is array-like
   resolve = Array;
  }
  resolve.forEach(object, block, context);
 }
};

function collectForms(document) {
 var result = document.body.getElementsByTagName('form');
 //print('collectForms');
 document.forms = result;
  
 for (var i=0; i&amp;lt;result.length; i++) {
     var f = result[i];
     f.name = f.attributes['name'];
     //print('Form '+f.name);
     document[f.name] = f;
     f.elements = f.getElementsByTagName('input');
     
     for(var j=0; j&amp;lt;f.elements.length; j++) {
         var e = f.elements[j];
         var attr = e.attributes;
         
         //forEach(attr, print);
         e.type = attr['type'];
         e.name = attr['name'];
         e.className = attr['class'];
         
         f[e.name] = e;
  //print('    Input '+e.name);
     }
 }
}

(function(){

 // Browser Navigator

 window.navigator = {
  get userAgent(){
   return &quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3&quot;;
  },
  get appVersion(){
   return &quot;Mozilla/5.0&quot;;
  }
 };
 
 var curLocation = (new java.io.File(&quot;./&quot;)).toURL();
 
 window.__defineSetter__(&quot;location&quot;, function(url){
  var xhr = new XMLHttpRequest();
  xhr.open(&quot;GET&quot;, url);
  xhr.onreadystatechange = function(){
   curLocation = new java.net.URL( curLocation, url );
   window.document = xhr.responseXML;
   collectForms(window.document);

   var event = document.createEvent();
   event.initEvent(&quot;load&quot;);
   window.dispatchEvent( event );
  };
  xhr.send();
 });
 
 window.__defineGetter__(&quot;location&quot;, function(url){
  return {
   get protocol(){
    return curLocation.getProtocol() + &quot;:&quot;;
   },
   get href(){
    return curLocation.toString();
   },
   toString: function(){
    return this.href;
   }
  };
 });
 
 // Timers

 var timers = [];
 
 window.setTimeout = function(fn, time){
  var num;
  return num = setInterval(function(){
   fn();
   clearInterval(num);
  }, time);
 };
 
 window.setInterval = function(fn, time){
  var num = timers.length;
  
  timers[num] = new java.lang.Thread(new java.lang.Runnable({
   run: function(){
    while (true){
     java.lang.Thread.currentThread().sleep(time);
     fn();
    }
   }
  }));
  
  timers[num].start();
 
  return num;
 };
 
 window.clearInterval = function(num){
  if ( timers[num] ) {
   timers[num].stop();
   delete timers[num];
  }
 };
 
 // Window Events
 
 var events = [{}];

 window.addEventListener = function(type, fn){
  if ( !this.uuid || this == window ) {
   this.uuid = events.length;
   events[this.uuid] = {};
  }
    
  if ( !events[this.uuid][type] )
   events[this.uuid][type] = [];
  
  if ( events[this.uuid][type].indexOf( fn ) &amp;lt; 0 )
   events[this.uuid][type].push( fn );
 };
 
 window.removeEventListener = function(type, fn){
    if ( !this.uuid || this == window ) {
        this.uuid = events.length;
        events[this.uuid] = {};
    }
    
    if ( !events[this.uuid][type] )
   events[this.uuid][type] = [];
   
  events[this.uuid][type] =
   events[this.uuid][type].filter(function(f){
    return f != fn;
   });
 };
 
 window.dispatchEvent = function(event){
  if ( event.type ) {
   if ( this.uuid &amp;amp;&amp;amp; events[this.uuid][event.type] ) {
    var self = this;
   
    events[this.uuid][event.type].forEach(function(fn){
     fn.call( self, event );
    });
   }
   
   if ( this[&quot;on&quot; + event.type] )
    this[&quot;on&quot; + event.type].call( self, event );
  }
 };
 
 // DOM Document
 
 window.DOMDocument = function(file){
  this._file = file;
  var factory = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance();
  factory.setValidating(false);
  this._dom = factory.newDocumentBuilder().parse(file);
  
  if ( !obj_nodes.containsKey( this._dom ) )
   obj_nodes.put( this._dom, this );
 };
 
 DOMDocument.prototype = {
  createTextNode: function(text){
   return makeNode( this._dom.createTextNode(
    text.replace(/&amp;amp;/g, &quot;&amp;amp;amp;&quot;).replace(/&amp;lt;/g, &quot;&amp;amp;lt;&quot;).replace(/&amp;gt;/g, &quot;&amp;amp;gt;&quot;)) );
  },
  createElement: function(name){
   return makeNode( this._dom.createElement(name.toLowerCase()) );
  },
  getElementsByTagName: function(name){
   return new DOMNodeList( this._dom.getElementsByTagName(
    name.toLowerCase()) );
  },
  getElementById: function(id){
   var elems = this._dom.getElementsByTagName(&quot;*&quot;);
   
   for ( var i = 0; i &amp;lt; elems.length; i++ ) {
    var elem = elems.item(i);
    if ( elem.getAttribute(&quot;id&quot;) == id )
     return makeNode(elem);
   }
   
   return null;
  },
  get body(){
   return this.getElementsByTagName(&quot;body&quot;)[0];
  },
  get documentElement(){
   return makeNode( this._dom.getDocumentElement() );
  },
  get ownerDocument(){
   return null;
  },
  addEventListener: window.addEventListener,
  removeEventListener: window.removeEventListener,
  dispatchEvent: window.dispatchEvent,
  get nodeName() {
   return &quot;#document&quot;;
  },
  importNode: function(node, deep){
   return makeNode( this._dom.importNode(node._dom, deep) );
  },
  toString: function(){
   return &quot;Document&quot; + (typeof this._file == &quot;string&quot; ?
    &quot;: &quot; + this._file : &quot;&quot;);
  },
  get innerHTML(){
   return this.documentElement.outerHTML;
  },
  
  get defaultView(){
   return {
    getComputedStyle: function(elem){
     return {
      getPropertyValue: function(prop){
       prop = prop.replace(/-(w)/g,function(m,c){
        return c.toUpperCase();
       });
       var val = elem.style[prop];
       
       if ( prop == &quot;opacity&quot; &amp;amp;&amp;amp; val == &quot;&quot; )
        val = &quot;1&quot;;
        
       return val;
      }
     };
    }
   };
  },
  
  createEvent: function(){
   return {
    type: &quot;&quot;,
    initEvent: function(type){
     this.type = type;
    }
   };
  }
 };
 
 function getDocument(node){
  return obj_nodes.get(node);
 }
 
 // DOM NodeList
 
 window.DOMNodeList = function(list){
  this._dom = list;
  this.length = list.getLength();
  
  for ( var i = 0; i &amp;lt; this.length; i++ ) {
   var node = list.item(i);
   this[i] = makeNode( node );
  }
 };
 
 DOMNodeList.prototype = {
  toString: function(){
   return &quot;[ &quot; +
    Array.prototype.join.call( this, &quot;, &quot; ) + &quot; ]&quot;;
  },
  get outerHTML(){
   return Array.prototype.map.call(
    this, function(node){return node.outerHTML;}).join('');
  }
 };
 
 // DOM Node
 
 window.DOMNode = function(node){
  this._dom = node;
 };
 
 DOMNode.prototype = {
  get nodeType(){
   return this._dom.getNodeType();
  },
  get nodeValue(){
   return this._dom.getNodeValue();
  },
  get nodeName() {
   return this._dom.getNodeName();
  },
  cloneNode: function(deep){
   return makeNode( this._dom.cloneNode(deep) );
  },
  get ownerDocument(){
   return getDocument( this._dom.ownerDocument );
  },
  get documentElement(){
   return makeNode( this._dom.documentElement );
  },
  get parentNode() {
   return makeNode( this._dom.getParentNode() );
  },
  get nextSibling() {
   return makeNode( this._dom.getNextSibling() );
  },
  get previousSibling() {
   return makeNode( this._dom.getPreviousSibling() );
  },
  toString: function(){
   return '&quot;' + this.nodeValue + '&quot;';
  },
  get outerHTML(){
   return this.nodeValue;
  }
 };

 // DOM Element

 window.DOMElement = function(elem){
  this._dom = elem;
  this.style = {
   get opacity(){ return this._opacity; },
   set opacity(val){ this._opacity = val + &quot;&quot;; }
  };
  
  // Load CSS info
  var styles = (this.getAttribute(&quot;style&quot;) || &quot;&quot;).split(/s*;s*/);
  
  for ( var i = 0; i &amp;lt; styles.length; i++ ) {
   var style = styles[i].split(/s*:s*/);
   if ( style.length == 2 )
    this.style[ style[0] ] = style[1];
  }
 };
 
 DOMElement.prototype = extend( new DOMNode(), {
  get nodeName(){
   return this.tagName.toUpperCase();
  },
  get tagName(){
   return this._dom.getTagName();
  },
  toString: function(){
   return &quot;&amp;lt;&quot; + this.tagName + (this.id ? &quot;#&quot; + this.id : &quot;&quot; ) + &quot;&amp;gt;&quot;;
  },
  get outerHTML(){
   var ret = &quot;&amp;lt;&quot; + this.tagName, attr = this.attributes;
   
   for ( var i in attr )
    ret += &quot; &quot; + i + &quot;='&quot; + attr[i] + &quot;'&quot;;
    
   if ( this.childNodes.length || this.nodeName == &quot;SCRIPT&quot; )
    ret += &quot;&amp;gt;&quot; + this.childNodes.outerHTML + 
     &quot;&amp;lt;/&quot; + this.tagName + &quot;&amp;gt;&quot;;
   else
    ret += &quot;/&amp;gt;&quot;;
   
   return ret;
  },
  
  get attributes(){
   var attr = {}, attrs = this._dom.getAttributes();
   
   for ( var i = 0; i &amp;lt; attrs.getLength(); i++ )
    attr[ attrs.item(i).nodeName ] = attrs.item(i).nodeValue;
    
   return attr;
  },
  
  get innerHTML(){
   return this.childNodes.outerHTML; 
  },
  set innerHTML(html){
   html = html.replace(/&amp;lt;/?([A-Z]+)/g, function(m){
    return m.toLowerCase();
   });
   
   var nodes = this.ownerDocument.importNode(
    new DOMDocument( new java.io.ByteArrayInputStream(
     (new java.lang.String(&quot;&amp;lt;wrap&amp;gt;&quot; + html + &quot;&amp;lt;/wrap&amp;gt;&quot;))
      .getBytes(&quot;UTF8&quot;))).documentElement, true).childNodes;
    
   while (this.firstChild)
    this.removeChild( this.firstChild );
   
   for ( var i = 0; i &amp;lt; nodes.length; i++ )
    this.appendChild( nodes[i] );
  },
  
  get textContent(){
   return nav(this.childNodes);
   
   function nav(nodes){
    var str = &quot;&quot;;
    for ( var i = 0; i &amp;lt; nodes.length; i++ )
     if ( nodes[i].nodeType == 3 )
      str += nodes[i].nodeValue;
     else if ( nodes[i].nodeType == 1 )
      str += nav(nodes[i].childNodes);
    return str;
   }
  },
  set textContent(text){
   while (this.firstChild)
    this.removeChild( this.firstChild );
   this.appendChild( this.ownerDocument.createTextNode(text));
  },
  
  style: {},
  clientHeight: 0,
  clientWidth: 0,
  offsetHeight: 0,
  offsetWidth: 0,
  
  get disabled() {
   var val = this.getAttribute(&quot;disabled&quot;);
   return val != &quot;false&quot; &amp;amp;&amp;amp; !!val;
  },
  set disabled(val) { return this.setAttribute(&quot;disabled&quot;,val); },
  
  get checked() {
   var val = this.getAttribute(&quot;checked&quot;);
   return val != &quot;false&quot; &amp;amp;&amp;amp; !!val;
  },
  set checked(val) { return this.setAttribute(&quot;checked&quot;,val); },
  
  get selected() {
   if ( !this._selectDone ) {
    this._selectDone = true;
    
    if ( this.nodeName == &quot;OPTION&quot; &amp;amp;&amp;amp; !this.parentNode.getAttribute(&quot;multiple&quot;) ) {
     var opt = this.parentNode.getElementsByTagName(&quot;option&quot;);
     
     if ( this == opt[0] ) {
      var select = true;
      
      for ( var i = 1; i &amp;lt; opt.length; i++ )
       if ( opt[i].selected ) {
        select = false;
        break;
       }
       
      if ( select )
       this.selected = true;
     }
    }
   }
   
   var val = this.getAttribute(&quot;selected&quot;);
   return val != &quot;false&quot; &amp;amp;&amp;amp; !!val;
  },
  set selected(val) { return this.setAttribute(&quot;selected&quot;,val); },

  get className() { return this.getAttribute(&quot;class&quot;) || &quot;&quot;; },
  set className(val) {
   if (typeof val != 'string') { val = &quot;&quot; + val; }
   return this.setAttribute(&quot;class&quot;,
    val.replace(/(^s*|s*$)/g,&quot;&quot;));
  },
  
  get type() { return this.getAttribute(&quot;type&quot;) || &quot;&quot;; },
  set type(val) { return this.setAttribute(&quot;type&quot;,val); },
  
  get value() { return this.getAttribute(&quot;value&quot;) || &quot;&quot;; },
  set value(val) { return this.setAttribute(&quot;value&quot;,val); },
  
  get src() { return this.getAttribute(&quot;src&quot;) || &quot;&quot;; },
  set src(val) { return this.setAttribute(&quot;src&quot;,val); },
  
  get id() { return this.getAttribute(&quot;id&quot;) || &quot;&quot;; },
  set id(val) { return this.setAttribute(&quot;id&quot;,val); },
  
  getAttribute: function(name){
   return this._dom.hasAttribute(name) ?
    new String( this._dom.getAttribute(name) ) :
    null;
  },
  setAttribute: function(name,value){
   this._dom.setAttribute(name,value);
  },
  removeAttribute: function(name){
   this._dom.removeAttribute(name);
  },
  
  get childNodes(){
   return new DOMNodeList( this._dom.getChildNodes() );
  },
  get firstChild(){
   return makeNode( this._dom.getFirstChild() );
  },
  get lastChild(){
   return makeNode( this._dom.getLastChild() );
  },
  appendChild: function(node){
   this._dom.appendChild( node._dom );
  },
  insertBefore: function(node,before){
   this._dom.insertBefore( node._dom, before ? before._dom : before );
  },
  removeChild: function(node){
   this._dom.removeChild( node._dom );
  },

  getElementsByTagName: DOMDocument.prototype.getElementsByTagName,
  
  addEventListener: window.addEventListener,
  removeEventListener: window.removeEventListener,
  dispatchEvent: window.dispatchEvent,
  
  click: function(){
   var event = document.createEvent();
   event.initEvent(&quot;click&quot;);
   this.dispatchEvent(event);
  },
  submit: function(){
   var event = document.createEvent();
   event.initEvent(&quot;submit&quot;);
   this.dispatchEvent(event);
  },
  focus: function(){
   var event = document.createEvent();
   event.initEvent(&quot;focus&quot;);
   this.dispatchEvent(event);
  },
  blur: function(){
   var event = document.createEvent();
   event.initEvent(&quot;blur&quot;);
   this.dispatchEvent(event);
  },
  get elements(){
   return this.getElementsByTagName(&quot;*&quot;);
  },
  get contentWindow(){
   return this.nodeName == &quot;IFRAME&quot; ? {
    document: this.contentDocument
   } : null;
  },
  get contentDocument(){
   if ( this.nodeName == &quot;IFRAME&quot; ) {
    if ( !this._doc )
     this._doc = new DOMDocument(
      new java.io.ByteArrayInputStream((new java.lang.String(
      &quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;))
      .getBytes(&quot;UTF8&quot;)));
    return this._doc;
   } else
    return null;
  }
 });
 
 // Helper method for extending one object with another
 
 function extend(a,b) {
  for ( var i in b ) {
   var g = b.__lookupGetter__(i), s = b.__lookupSetter__(i);
   
   if ( g || s ) {
    if ( g )
     a.__defineGetter__(i, g);
    if ( s )
     a.__defineSetter__(i, s);
   } else
    a[i] = b[i];
  }
  return a;
 }
 
 // Helper method for generating the right
 // DOM objects based upon the type
 
 var obj_nodes = new java.util.HashMap();
 
 function makeNode(node){
  if ( node ) {
   if ( !obj_nodes.containsKey( node ) )
    obj_nodes.put( node, node.getNodeType() == 
     Packages.org.w3c.dom.Node.ELEMENT_NODE ?
      new DOMElement( node ) : new DOMNode( node ) );
   
   return obj_nodes.get(node);
  } else
   return null;
 }
 
 // XMLHttpRequest
 // Originally implemented by Yehuda Katz

 window.XMLHttpRequest = function(){
  this.headers = {};
  this.responseHeaders = {};
 };
 
 XMLHttpRequest.prototype = {
  open: function(method, url, async, user, password){ 
   this.readyState = 1;
   if (async)
    this.async = true;
   this.method = method || &quot;GET&quot;;
   this.url = url;
   this.onreadystatechange();
  },
  setRequestHeader: function(header, value){
   this.headers[header] = value;
  },
  getResponseHeader: function(header){ },
  send: function(data){
   var self = this;
   
   function makeRequest(){
    var url = new java.net.URL(curLocation, self.url);
    
    if ( url.getProtocol() == &quot;file&quot; ) {
     if ( self.method == &quot;PUT&quot; ) {
      var out = new java.io.FileWriter( 
        new java.io.File( new java.net.URI( url.toString() ) ) ),
       text = new java.lang.String( data || &quot;&quot; );
      
      out.write( text, 0, text.length() );
      out.flush();
      out.close();
     } else if ( self.method == &quot;DELETE&quot; ) {
      var file = new java.io.File( new java.net.URI( url.toString() ) );
      file[&quot;delete&quot;]();
     } else {
      var connection = url.openConnection();
      connection.connect();
      handleResponse();
     }
    } else { 
     var connection = url.openConnection();
     
     connection.setRequestMethod( self.method );
     
     // Add headers to Java connection
     for (var header in self.headers)
      connection.addRequestProperty(header, self.headers[header]);
    
     connection.connect();
     
     // Stick the response headers into responseHeaders
     for (var i = 0; ; i++) { 
      var headerName = connection.getHeaderFieldKey(i); 
      var headerValue = connection.getHeaderField(i); 
      if (!headerName &amp;amp;&amp;amp; !headerValue) break; 
      if (headerName)
       self.responseHeaders[headerName] = headerValue;
     }
     
     handleResponse();
    }
    
    function handleResponse(){
     self.readyState = 4;
     self.status = parseInt(connection.responseCode) || undefined;
     self.statusText = connection.responseMessage || &quot;&quot;;
     
     var stream = new java.io.InputStreamReader(connection.getInputStream()),
      buffer = new java.io.BufferedReader(stream), line;
     
     while ((line = buffer.readLine()) != null)
      self.responseText += line;
      
     self.responseXML = null;
     
     if ( self.responseText.match(/^s*&amp;lt;/) ) {
      //try {
       self.responseXML = new DOMDocument(
        new java.io.ByteArrayInputStream(
         (new java.lang.String(
          self.responseText)).getBytes(&quot;UTF8&quot;)));
      //} catch(e) {
      //}
     }
    }
    
    self.onreadystatechange();
   }

   if (this.async)
    (new java.lang.Thread(new java.lang.Runnable({
     run: makeRequest
    }))).start();
   else
    makeRequest();
  },
  abort: function(){},
  onreadystatechange: function(){},
  getResponseHeader: function(header){
   if (this.readyState &amp;lt; 3)
    throw new Error(&quot;INVALID_STATE_ERR&quot;);
   else {
    var returnedHeaders = [];
    for (var rHeader in this.responseHeaders) {
     if (rHeader.match(new Regexp(header, &quot;i&quot;)))
      returnedHeaders.push(this.responseHeaders[rHeader]);
    }
   
    if (returnedHeaders.length)
     return returnedHeaders.join(&quot;, &quot;);
   }
   
   return null;
  },
  getAllResponseHeaders: function(header){
   if (this.readyState &amp;lt; 3)
    throw new Error(&quot;INVALID_STATE_ERR&quot;);
   else {
    var returnedHeaders = [];
    
    for (var header in this.responseHeaders)
     returnedHeaders.push( header + &quot;: &quot; + this.responseHeaders[header] );
    
    return returnedHeaders.join(&quot;rn&quot;);
   }
  },
  async: true,
  readyState: 0,
  responseText: &quot;&quot;,
  status: 0
 };
})();
</pre>
</div>
<br /> Tagged: Java, JavaScript, JUnit, TDD <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/darkviews.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/darkviews.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/darkviews.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=164&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.pdark.de/2008/11/18/testing-the-impossible-javascript-in-a-web-page/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a4d6f03a8879432d8563aefbf48e787?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">digulla</media:title>
		</media:content>
	</item>
		<item>
		<title>Quickly disabling tests</title>
		<link>http://blog.pdark.de/2007/07/25/quickly-disabling-tests/</link>
		<comments>http://blog.pdark.de/2007/07/25/quickly-disabling-tests/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 06:56:00 +0000</pubDate>
		<dc:creator>digulla</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://darkviews.wordpress.com/2007/07/25/quickly-disabling-tests/</guid>
		<description><![CDATA[Ever needed to disable all (or most) tests in a JUnit test case? How about this: Using the editor of your choice, search for &#8220;void test&#8221; and replace all of them with &#8220;void dtest&#8221; (&#8220;d&#8221; as in disabled). Now, you can simply enable the few tests you need to run by deleting the &#8220;d&#8221; again. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=21&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ever needed to disable all (or most) tests in a JUnit test case?</p>
<p>How about this: Using the editor of your choice, search for &#8220;<tt>void test</tt>&#8221; and replace all of them with &#8220;<tt>void dtest</tt>&#8221; (&#8220;d&#8221; as in disabled). Now, you can simply enable the few tests you need to run by deleting the &#8220;d&#8221; again.</p>
<p>I&#8217;m also using &#8220;x&#8221; to take out tests that won&#8217;t run for a while. Using global search in the whole project, it&#8217;s also simple to find them again just in case you&#8217;re wondering if there are any disabled tests left.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/darkviews.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/darkviews.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/darkviews.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/darkviews.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/darkviews.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.pdark.de&amp;blog=6384723&amp;post=21&amp;subd=darkviews&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.pdark.de/2007/07/25/quickly-disabling-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a4d6f03a8879432d8563aefbf48e787?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">digulla</media:title>
		</media:content>
	</item>
	</channel>
</rss>
