<?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/"
	>

<channel>
	<title>www.BrettDaniel.com &#187; Research</title>
	<atom:link href="http://www.brettdaniel.com/category/research/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brettdaniel.com</link>
	<description>Brett Daniel's personal website</description>
	<lastBuildDate>Wed, 29 Dec 2010 17:44:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Testing a Testing Tool Part Three: ReAsserting ReAssert</title>
		<link>http://www.brettdaniel.com/archives/2010/03/11/171530/</link>
		<comments>http://www.brettdaniel.com/archives/2010/03/11/171530/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 22:15:30 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[JUnit]]></category>
		<category><![CDATA[ReAssert]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1882</guid>
		<description><![CDATA[This is the third in a series of posts in which I discuss the challenges I encountered when testing ReAssert. I already showed how I used tests as their own input and automatically deployed ReAssert for my own use. Here, I combine both aspects by demonstrating how ReAssert can repair its own unit tests.]]></description>
			<content:encoded><![CDATA[<p>This is the third in a series of posts in which I discuss the challenges I encountered when testing <a href="http://mir.cs.uiuc.edu/reassert/">ReAssert</a>. I already showed how I <a href="http://www.brettdaniel.com/archives/2010/02/22/004354/">used tests as their own input</a> and <a href="http://www.brettdaniel.com/archives/2010/02/24/141939/">automatically deployed ReAssert for my own use</a>. Here, I combine both aspects by demonstrating how ReAssert can repair its own unit tests.</p>

<h3>ReAsserting ReAssert</h3>

<p>Tests break when the system under test evolves in ways that invalidate the assumptions encoded in the tests. ReAssert addresses this problem by making it easier to update tests to reflect the changed behavior. Like any other complex piece of software, ReAssert itself has evolved, making it susceptible to the same problem that it attempts to solve. There have been several times in which a change to ReAssert broke its unit tests. It is natural to ask whether ReAssert could repair them.</p>

<p>Recall from the <a href="http://www.brettdaniel.com/archives/2010/02/22/004354/">first post in this series</a> that ReAssert's unit tests have two parts: a failing test method marked with the <code>@Test</code> annotation and its expected repair marked with the <code>@Fix</code> annotation. When such a test breaks, it means that the @Fix method must change to reflect ReAssert's actual output.</p>

<p>Here is a real example of one time that ReAssert's evolution caused tests to break. An early version of ReAssert lacked the ability to trace an expected value back to its declaration. Instead, ReAssert would simply overwrite the expected side of a failing assertion. The following code (similar to the example used in the first post) shows the <code>@Test</code> and <code>@Fix</code> methods that verified this early behavior.</p>

<pre lang="java">
@Test
public void testString() {
  String expected = "expected";
  String actual = "actual";
  assertEquals(expected, actual);
}
@Fix("testString")
public void fixString() {
  String expected = "expected";
  String actual = "actual";
  assertEquals("actual", actual);
}
</pre>

<p>This is probably not what the developer would expect. Overwriting the expected side removes the use of the <code>expected</code> variable. This makes the test harder to understand and might cause a compiler warning since the variable is not used anywhere else. Such a repair could also cause other tests to fail if the assertion was located in a utility method called from multiple places. Indeed, this behavior confused several participants in the user study that <a href="http://www.vilasjagannath.com/">Vilas</a> and I performed to evaluate ReAssert.</p>

<p>I changed ReAssert such that it would instead replace the initial value of a variable used on the expected side of a failing assertion. Even though I wrote tests to verify this behavior prior to making the change, it still caused many tests to break. The example above broke, and it was necessary to update the <code>@Fix</code> method in the following way:</p>

<pre lang="java">
@Fix("testString")
public void fixString() {
  String expected = "actual";
  String actual = "actual";
  assertEquals(expected, actual);
}
</pre>

<p>Since I had the ReAssert plugin installed as per <a href="http://www.brettdaniel.com/archives/2010/02/24/141939/">the second post in this series</a>, I wanted it to automate repairs like the one above.  Doing so proved challenging because the process was so self-referential: ReAssert used ReAssert's result to repair a test that (as per part one) triggered ReAssert. Don't worry if that sounds confusing because it is. The following diagram illustrates the process more clearly:</p>

<div class="picsholder">
<a href="http://www.brettdaniel.com/gallery/2010/reasserting_reassert.gif"><img src="http://www.brettdaniel.com/pictures/2010/reasserting_reassert.s.gif" alt="ReAsserting ReAssert" title="ReAsserting ReAssert" class="pic" /></a></div>

<p>To avoid confusion, I will refer to the "upper" and "lower" instances of ReAssert. The upper instance is triggered when I tell the plugin to repair a failing <code>@Test</code>-and-<code>@Fix</code> method pair. The upper instance executes the test under JUnit, which&mdash;via <code>FixChecker</code>, my custom test runner&mdash;invokes the lower instance of ReAssert. The lower instance "repairs" the body of the <code>@Test</code> method and saves the result in memory. Finally the upper instance copies this result into the body of the <code>@Fix</code> method and outputs the repaired source code.</p>

<p>But what prevents the lower instance from introducing an infinite recursive loop? After all, the lower instance of ReAssert invokes JUnit, which runs the test with <code>FixChecker</code>, which repairs the test with ReAssert, which invokes JUnit, and so on. <code>FixChecker</code> breaks this loop by ensuring that only one instance of itself is active. This allows the lowermost instance of JUnit to execute <code>@Test</code> normally.</p>

<p>This experience with ReAssert reinforced my belief that meta-execution is an ideal way to test and improve software development tools. Not only does the developer discover bugs that would otherwise impact users, but executing a program on itself can indicate how easily one can extend the tool's behavior. In ReAssert's case, meta-execution not only uncovered many bugs but also led to several improvements in the internal design of the tool.</p>

<p>I think ReAssert's meta-repair capability is one of the most interesting aspects of the tool. Unfortunately, I didn't have room to describe it in the paper, which is why I wanted to write this series of weblog posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2010/03/11/171530/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing a Testing Tool Part Two: Build and Deploy Local Eclipse Plugin</title>
		<link>http://www.brettdaniel.com/archives/2010/02/24/141939/</link>
		<comments>http://www.brettdaniel.com/archives/2010/02/24/141939/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 19:19:39 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ReAssert]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1819</guid>
		<description><![CDATA[In my previous post, I discussed the first of several challenges I encountered when testing ReAssert. In this, the second of three articles in the series, I will describe how I automatically deployed the tool for my own use.]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.brettdaniel.com/archives/2010/02/22/004354/">previous post</a>, I discussed the first of several challenges I encountered when testing <a href="http://mir.cs.illinois.edu/reassert/">ReAssert</a>. In this, the second of three articles in the series, I will describe how I automatically deployed the tool for my own use.</p>

<h3>Build and Deploy Local Eclipse Plugin</h3>

<p>When developing software tools, it is good practice to <a href="http://en.wikipedia.org/wiki/Eating_one%27s_own_dog_food">eat one's own dog food</a> by using the tool oneself. It is one of the easiest ways to uncover bugs and improve usability. I ate ReAssert's dog food by using it to repair tests in other research projects and (as I'll describe in the next post) ReAssert itself. </p>

<p>ReAssert is implemented as an <a href="http://eclipse.org/">Eclipse</a> plugin. The easiest way to deploy such a plugin is to include it in Eclipse's <code>plugins</code> directory<sup>1</sup>. When Eclipse starts, it automatically loads all plugins in the directory. If there is more than one version of a particular plugin, Eclipse loads the most recent.</p>

<p>To keep from having to install ReAssert's plugin manually, I made it such that the normal build process automatically updates version numbers and copies the plugin to the appropriate place. A single <a href="http://ant.apache.org/">Ant build script</a> handles the entire process.</p>

<p>The main challenge lies in accessing Eclipse's build metadata in the script. Each Eclipse plugin holds the metadata in a file called <code>MANIFEST.MF</code>.  It contains things like the plugin's name, it's version number, and the other plugins it depends on. For example, here is part of ReAssert's:</p>

<pre>
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: edu.illinois.reassert.plugin
Bundle-SymbolicName: edu.illinois.reassert.plugin;singleton:=true
Bundle-Version: 0.3.0.201002231921
Bundle-Activator: edu.illinois.reassert.plugin.ReAssertPlugin
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 ...
Bundle-Vendor: University of Illinois at Urbana-Champaign
</pre>

<p>ReAssert's build script first updates this file with the build number (based on the current date and time). Then, it reads the version and build number by converting <code>MANIFEST.MF</code> into a <a href="http://ant.apache.org/manual/CoreTasks/property.html">Ant property file</a>. Finally, it bundles the plugin using the values.</p>

<p>Here are the relevant pieces of the script that implements this process:</p>

<ol>

<li>Set the date and time with <code><a href="http://ant.apache.org/manual/CoreTasks/tstamp.html">tstamp</a></code>, then replace the build number in the manifest with the date and time.

<pre lang="xml">
<tstamp /> <!-- set ${DSTAMP} and ${TSTAMP} -->
<replaceregexp 
    file="META-INF/MANIFEST.MF" 
    match="Bundle\-Version: ([0-9]+\.[0-9]+\.[0-9]+)\.([0-9]+)"
    replace="Bundle-Version: \1.${DSTAMP}${TSTAMP}" />
</pre>
</li>

<li>Convert <code>MANIFEST.MF</code> into <code>manifest.properties</code> that Ant can read.<sup>2</sup>

<pre lang="xml">
<copy file="META-INF/MANIFEST.MF" tofile="manifest.properties" />
<replace file="manifest.properties">
  <replacefilter token=":=" value="=" />
  <replacefilter token=":" value="=" />
  <replacefilter token=";" value="" />
</replace>
<property file="manifest.properties"/>
</pre>
</li>

<li>Set plugin name using the properties and bundle the plugin's JAR file. 

<pre lang="xml">                
<property 
    name="plugin.jar" 
    value="${dist.dir}/${Bundle-Name}_${Bundle-Version}.jar" />
<jar 
    destfile="${plugin.jar}"
    manifest="META-INF/MANIFEST.MF">
  <fileset dir="${bin.dir}" />
  <fileset dir="." includes="${lib.dir}/**/*" />
  <fileset dir="." includes="META-INF/MANIFEST.MF" />
  <fileset dir="." includes="plugin.xml" />
</jar>
</pre>
</li>

<li>Copy the JAR to Eclipse's <code>plugins</code> directory. The <code>eclipse.home</code> variable is set when the script is run within Eclipse.

<pre lang="xml">
<copy file="${plugin.jar}" todir="${eclipse.home}/plugins/" />
<echo>Restart Eclipse to enable plugin</echo>
</pre>
</li>

</ol>

<p>It is a pretty straightforward process but useful to keep my installed version of ReAssert up to date.</p>

<p>I have also seen a similar process scaled up to an entire enterprise. The company had an automated nightly build process that would post the plugin to an Eclipse Update Site on the local intranet. Every morning developers would update to the latest plugin. Any bugs they found while using the tool went straight into the bug tracking system.</p><h3>Notes</h3><ol class="footnotes"><li id="footnote_0_1819" class="footnote">One can also install plugins through Eclipse's <a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-34.htm">Update Manager</a> with a <a href="http://wiki.eclipse.org/FAQ_How_do_I_create_an_update_site_(site.xml)%3F">plugin update site</a>, but I felt this was overkill for ReAssert since it was such a simple plugin.</li><li id="footnote_1_1819" class="footnote">Adapted from <a href="http://www.informit.com/articles/article.aspx?p=1315271&amp;seqNum=4">this article describing how to build a simple plugin</a>.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2010/02/24/141939/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing a Testing Tool Part One: Tests as Test Inputs</title>
		<link>http://www.brettdaniel.com/archives/2010/02/22/004354/</link>
		<comments>http://www.brettdaniel.com/archives/2010/02/22/004354/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 05:43:54 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[JUnit]]></category>
		<category><![CDATA[ReAssert]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1533</guid>
		<description><![CDATA[I wrote ReAssert to make it easier to maintain unit tests.  Ironically, I encountered several challenges when testing ReAssert itself.  First, ReAssert acts on source code, so I created a test framework that made it easy to build input programs and check ReAssert's output. Second, I ate my own dogfood by deploying the tool on my local machine.  Finally, I combined both aspects by ReAsserting ReAssert itself.]]></description>
			<content:encoded><![CDATA[<p>I wrote <a href="http://mir.cs.illinois.edu/reassert/">ReAssert</a> to make it easier to maintain unit tests.  Ironically, I encountered several challenges when testing ReAssert itself.  First, ReAssert acts on source code, so I created a test framework that made it easy to build input programs and check ReAssert's output. Second, I <a href="http://en.wikipedia.org/wiki/Eating_one%27s_own_dog_food">ate my own dogfood</a> by deploying the tool on my local machine.  Finally, I combined both aspects by ReAsserting ReAssert itself.</p>

<p>This is the first of what I expect to be three posts in which I discuss these challenges.</p>

<h3>Tests as Test Inputs</h3>

<p>ReAssert transforms source code. Given the source code of a failing unit test, it outputs a transformed test that passes. Testing program transformation tools is difficult because writing input programs, passing them to the tool, and checking the output requires a lot of effort. Developers often automate the process by saving inputs and expected outputs to the filesystem or including them as string literals in their unit tests. Tests pass the input file contents or string literal to the tool and then verify that the tool's output exactly matches the expected output.</p>

<p>Both approaches are exceptionally common but have several disadvantages. First, files make it difficult to debug failures, since it can be difficult to figure out which file(s) corresponds to which test(s). Second, strings can make test code very verbose, and one has to worry about linebreaks, escape characters, and character encoding. Strings are also opaque to the IDE, so they lack helpful features like syntax highlighting and automatic formatting. Finally, both approaches require that the tool's output exactly matches the expected output byte-for-byte, whitespace and all. Such strict matching is rarely necessary when checking source code and can make tests very fragile. As soon as one changes the tool's pretty-printer, it can break every test even if program contents remain the same (which is actually one of the problems that ReAssert aims to solve).</p>

<p>I wanted ReAssert's unit tests to make testing as simple as possible while avoiding the problems caused by input files or string literals. The solution I built relies on the fact that ReAssert acts on unit tests. The test itself serves as the input to ReAssert, and another method in the same test class represents the expected output. To implement this idea, I extended JUnit's default behavior with a custom test runner called <code>FixChecker</code> and a new <code>@Fix</code> method annotation.</p>

<p>Here is an example: say I want to test that ReAssert replaces the initial value of a string used in a failing assertion. The failing test would look something like the following:</p>

<pre lang="java">
@Test
public void testString() {
  String expected = "expected";
  String actual = "actual";
  assertEquals(expected, actual);
}
</pre>

<p>ReAssert should repair the test by replacing the <code>"expected"</code> string with <code>"actual"</code>. To verify this behavior, I create a second method annotated with <code>@Fix</code> whose body contains the expected repair.</p>

<pre lang="java">
@Fix("testString")
public void fixString() {
  String expected = "actual";
  String actual = "actual";
  assertEquals(expected, actual);
}
</pre>

<p>Then, I tell JUnit to use <code>FixChecker</code> by annotating the test class with JUnit's <code>@<a href="http://kentbeck.github.com/junit/javadoc/latest/org/junit/runner/RunWith.html">RunWith</a></code> annotation. <code>FixChecker</code> intercepts JUnit's normal result when a test fails. It then "repairs" the test and checks that the repair matches the body of the <code>@Fix</code> method. If not, or if no <code>@Fix</code> method exists, then the runner reports that the test fails. Otherwise, it reports that the test passes. In a sense, the <code>@Test</code>-and-<code>@Fix</code> method pair act like <code>assertEquals</code> with the repaired test on the actual side and the <code>@Fix</code> method on the expected side.</p>

<p><code>FixChecker</code>'s repairs do not change the source code directly. Instead, it holds the modified source code in memory and compares it against the parsed source code of the <code>@Fix</code> method. In this way, the comparison ignores differences in source code formatting, and one can use either qualified or unqualified class names. Also, since both the test and the <code>@Fix</code> are normal methods, they can reuse aspects of the surrounding test class, and both receive the full support of the IDE.</p>

<p><code>FixChecker</code> also provides two other useful features. First, it is smart enough to ignore tests that pass and lack an <code>@Fix</code> method. Instead, it forwards them along to JUnit unchanged. This allows me to mix ReAssert tests with standard unit tests. Second, I can test when ReAssert is expected to fail by marking unrepairable tests with <code>@Unfixable</code>, another new annotation that <code>FixChecker</code> knows to look for.</p>

<pre lang="java">
@Test
@Unfixable
public void testIgnoreAssertFail() {
  fail();
}
</pre>

<p>Several aspects of this framework are applicable to other program transformation tools. It is often useful to use real application code when testing even when a tool does not act solely on unit tests. Also, custom test runners can be exceptionally powerful and allow one to tailor tests to many contexts.</p>

<p>In later posts, I'll describe how I automatically deployed ReAssert for my own use, and how I used the tool to repair its own unit tests.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2010/02/22/004354/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JUnit Theories</title>
		<link>http://www.brettdaniel.com/archives/2009/09/10/004350/</link>
		<comments>http://www.brettdaniel.com/archives/2009/09/10/004350/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 05:43:50 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Grad School]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1429</guid>
		<description><![CDATA[This semester I am overseeing two undergraduate senior theses. The two students are working on a project involving JUnit Theories. Theories are a very useful feature of JUnit, but they have not been widely adopted since they are still experimental and not documented very extensively. The project's short-term goal is to address this problem by [...]]]></description>
			<content:encoded><![CDATA[<p>This semester I am overseeing two undergraduate senior theses.  The two students are working on a project involving <a href="http://junit.sourceforge.net/doc/ReleaseNotes4.4.html#theories">JUnit Theories</a>.  Theories are a very useful feature of JUnit, but they have not been widely adopted since they are still experimental and not documented very extensively.  The project's short-term goal is to address this problem by writing a suite of Theories for use as benchmarks in testing research.  In the longer term, we hope to apply knowledge gained by writing Theories to other research projects and find areas in which Theories can be improved.</p>

<p>This post describes what Theories are and what they do.  In future posts, I hope to write about why I find them interesting and how they enable more complex testing tasks.</p>

<p>"<a href="http://groups.csail.mit.edu/pag/pubs/testing-theories-tr002-abstract.html">Theories in practice: Easy-to-write specifications that catch bugs</a>" defines Theories in the following way<sup>1</sup>:</p>

<blockquote cite="http://groups.csail.mit.edu/pag/pubs/testing-theories-tr002-abstract.html">
<p>[Theories] are partial specifications of program behavior.
Theories are written much like like test methods,
but are universally quantified: all of the theory’s assertions
must hold for all arguments that satisfy the assumptions...A theory can be viewed in several ways. It is a universally quantified
("for-all") assertion, as contrasted to an assertion
about a specific datum. It is a generalization of a set of
example-based tests. It is a (possibly partial) specification
of the method under test.</p>
</blockquote>

<p>To understand what this definition means, it is easiest to explain a simple example.  Say we have a simple <code>Counter</code> class that allows one to increment an integer value every time the <code>increment</code> method is called.</p>

<pre lang="java">
public class Counter {
    private int value;

    public Counter(int init) {
        this.value = init;
    }

    public void increment() {
        value = value + 1;
    }
		
    public int getValue() {
        return value;
    }
}
</pre>

<p>We wish to test that incrementing always increases a counter's value by one.  The standard way to test this functionality is to write an <em>example-based unit test</em> that creates a <code>Counter</code>, increments it a few times, and asserts that the incremented values are correct.</p>

<pre lang="java">
@Test 
public void testIncrement()	{
    Counter c = new Counter(3);
    c.increment();
    assertEquals(4, c.getValue());
    c.increment();
    assertEquals(5, c.getValue());
}
</pre>

<p>This is a useful test, but it only verifies that a single counter initialized to three is incremented correctly.  It would be good to test additional counters initialized to many different values.  Doing so using example-based testing requires multiple test methods or testing objects in a loop.</p>

<p>Theories provide an elegant alternative that complements example-based tests.  From the test writer's point of view, Theories are just like normal unit tests but with one or more parameters.<sup>2</sup>  To test <code>incremement</code>, one can write a Theory that accepts a <code>Counter</code> object, increments it, then asserts that the value has increased by one.  This is more general than an example-based test because it verifies a property common to <em>all</em> counters, regardless of how they were initialized.  In the following code, the <code>incrementTheory</code> method implements such a Theory.</p>

<pre lang="java">
@RunWith(Theories.class)
public class CounterTheories {
   
    @DataPoints 
    public static Counter[] data() {
        return new Counter[] {
            new Counter(0),
            new Counter(1),
            new Counter(-1),
            new Counter(Integer.MIN_VALUE),
            new Counter(Integer.MAX_VALUE), // overflows when incremented
        };
    }

    @Theory
    public void incrementTheory(Counter toIncrement) {
        int oldValue = toIncrement.getValue();
        assumeTrue(Integer.MAX_VALUE != oldValue);
        toIncrement.increment();
        int newValue = toIncrement.getValue();
        assertEquals(oldValue + 1, newValue);
    }

    //... more theories 
}
</pre>

<p>The <code>@RunWith(Theories.class)</code> annotation tells JUnit that it should run all methods in the class that are annotated with <code>@Theory</code>.  The <code>@DataPoints</code> annotation marks methods that return values that JUnit should supply to applicable Theories. At runtime, JUnit matches the values returned from data point methods or fields to appropriate Theory parameters.<sup>3</sup>  In the example above, it sees that <code>Counter</code> objects are produced by <code>data</code> and consumed by <code>incrementTheory</code>, so it executes <code>incrementTheory</code> once for each element in the array returned from <code>data</code>.</p>

<p>Theories decouple test inputs from test implementation.  Data points are automatically reused across multiple theories (even in subclasses), making it easier to write new tests.  Adding a data point often provides a value that a test writer may not have originally considered, thus improving all Theories that use the data point.</p>

<p>But certain data points may not be applicable to a particular Theory.  The test writer describes what data points apply by using methods provided by the <code>org.junit.Assume</code> class.  Assumptions are similar to normal assertions except they cause a Theory to skip certain data points rather than fail.  In our example, <code>incrementTheory</code> should not increment a counter whose value is equal to <code>Integer.MAX_VALUE</code> since the value would overflow.  Therefore, <code>incrementTheory</code> uses <code>assumeTrue</code> to check for this special case.</p>

<p>This summary and example briefly describes the basics of Theories but glosses over how Theories work internally and lacks practical advice like how to write "good" theories.  I hope that the undergrads and future weblog posts can explore these topics and deeper research issues further.</p><h3>Notes</h3><ol class="footnotes"><li id="footnote_0_1429" class="footnote">See also <a href="http://shareandenjoy.saff.net/2006/12/new-paper-practice-of-theories.html">an early paper on Theories</a> and <a href="http://shareandenjoy.saff.net/2007/04/popper-and-junitfactory.html">the initial announcement</a> of their inclusion as part of an experimental project called Popper.</li><li id="footnote_1_1429" class="footnote">.NET offers a similar feature but calls it&mdash;perhaps more descriptively&mdash;<em><a href="http://research.microsoft.com/en-us/projects/Pex/">parameterized unit tests</a></em>. JUnit uses this term to mean <a href="http://junit.org/junit/javadoc/4.5/org/junit/runners/Parameterized.html">test classes that are instantiated with input data</a>.</li><li id="footnote_2_1429" class="footnote">Internally, JUnit finds data points whose declared types derive from the declared types of Theory parameters. It does not currently <a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html">box and unbox</a> primitive data points. I submitted a <a href="http://github.com/brettdaniel/junit/commit/864ef396eccdbfc7b48b88fe05997aa891ef754a">simple patch</a> that fixes the problem, but it has not yet been accepted.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2009/09/10/004350/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ReAssert at ASE 2009</title>
		<link>http://www.brettdaniel.com/archives/2009/07/24/200907/</link>
		<comments>http://www.brettdaniel.com/archives/2009/07/24/200907/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 01:09:07 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Grad School]]></category>
		<category><![CDATA[ReAssert]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1401</guid>
		<description><![CDATA[In my previous post, I wrote about ReAssert, the tool I built to automatically fix broken unit tests.  Yesterday I received notification that the paper describing the tool got accepted to ASE 2009.]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.brettdaniel.com/archives/2009/07/10/191923/">previous post</a>, I wrote about <a href="http://mir.cs.illinois.edu/reassert/">ReAssert</a>, the tool I built to automatically fix broken unit tests.  Yesterday I received notification that the paper describing the tool got accepted to <a href="https://www.se.auckland.ac.nz/conferences/ase09/">ASE 2009</a>.</p>

<p>This is the same paper mentioned in my <a href="http://www.brettdaniel.com/archives/2009/05/18/220240/">crunch time analysis</a> and <a href="http://www.brettdaniel.com/archives/2009/05/10/030433/">typography request</a>.</p>

<p>Here is the (working) abstract:</p>

<blockquote>
<p>Developers often change software in ways that cause tests to fail. When this occurs, developers must determine whether failures are caused by errors in the code under test or in the test code itself. In the latter case, developers must repair failing tests or remove them from the test suite. Fixing tests is time consuming but beneficial, since removing tests reduces a test suite's ability to detect regressions. Fortunately, simple program transformations can repair many failing tests automatically.</p>

<p>We present <em>ReAssert</em>, a novel technique and tool that suggests repairs to failing tests' code which cause the tests to pass. Examples include replacing literal values in tests, changing assertion methods, or replacing one assertion with several. If the developer chooses to apply the repairs, ReAssert modifies the code automatically. Our experiments show that ReAssert can repair many common test failures and that its suggested repairs correspond to developers' expectations.</p>
</blockquote>

<p>The conference will be held in Auckland, New Zealand.  I am excited to travel overseas to present my work.  <a href="http://vilasjagannath.com/">Vilas</a>, my coauthor, and Yun-Young, my officemate, are both from New Zealand and are eager to visit home.</p>

<h3>Update September 8, 2009</h3>

<p>I have posted <a href="http://mir.cs.illinois.edu/reassert/pubs/reassert.pdf">the final version of the paper</a> and updated the <a href="http://mir.cs.illinois.edu/reassert/">ReAssert homepage</a>.</p>

<h3>Update November 30, 2009</h3>

<p>The conference presentation went very well, and I got a great deal of insightful questions and feedback from other attendees. <a href="http://mir.cs.illinois.edu/reassert/pubs/reassert-ase09-slides.pdf">Here are the presentation slides</a>. I told the story of Alice the software developer like in <a href="http://www.brettdaniel.com/archives/2009/07/10/191923/">the previous ReAssert post</a>.  The presentation starts with a picture of Alice adapted (as per Creative Commons) from <a href="http://xkcd.com/662/">xkcd #662</a>.</p>

<div class="picsholder">
<a href="http://www.brettdaniel.com/gallery/2009/alice.png"><img src="http://www.brettdaniel.com/pictures/2009/alice.s.png" alt="Alice the software developer. Adapted from xkcd #662 and used in my ReAssert presentation." title="Alice the software developer. Adapted from xkcd #662 and used in my ReAssert presentation." class="pic" /></a></div>

<p>I had originally planned to draw a picture <a href="http://www.brettdaniel.com/gallery/drawings/">in my normal cartoon style</a>, but decided instead to use something simpler.  The xkcd picture turned out to be a good choice; it made the audience laugh, and one attendee mentioned Scott McCloud's assertion from <a href="http://www.amazon.com/gp/product/006097625X?ie=UTF8&amp;tag=brettdacom-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=006097625X">Understanding Comics</a> that a simple face causes the audience to identify themselves in a character.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2009/07/24/200907/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ReAssert: Suggesting Repairs for Broken Unit Tests</title>
		<link>http://www.brettdaniel.com/archives/2009/07/10/191923/</link>
		<comments>http://www.brettdaniel.com/archives/2009/07/10/191923/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 00:19:23 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ReAssert]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1370</guid>
		<description><![CDATA[For the past year or so, I have been researching how software tests fail and the ways in which developers fix the failures.  There are many interesting problems within this general theme, but I have most recently focused on the following familiar scenario:]]></description>
			<content:encoded><![CDATA[<p>For the past year or so, I have been researching how software tests fail and the ways in which developers fix the failures.  There are many interesting problems within this general theme, but I have most recently focused on the following familiar scenario:</p>

<blockquote>
<p>Alice is a developer a large software company.  She works on the company's flagship product and spends over half of her time writing unit tests to verify her code and document her assumptions.  She is not alone in this respect; the company requires that functional changes and bugfixes should have corresponding unit tests to prevent regressions.  As a result, the product's unit test suite achieves exceptionally high coverage.</p>

<p>One day, the project manager informs Alice that a key requirement has changed.  The changed requirement violates many assumptions encoded the test suite, so several dozen tests fail after Alice modifies the software.  Now Alice has a choice: should she remove the failing tests since they no longer reflect the correct behavior of the software, or should she attempt to repair the tests, which would require tedious and time-consuming manual editing?</p>
</blockquote>

<p>Developers often have to make a similar choice.  When tests fail due to problems with test code rather than the system under test, it is undoubtedly beneficial to fix the broken tests, since removing tests reduces a test suite's ability to detect regressions.  However, developers may not take the time to fix the broken tests.  For example, while working on <a href="http://mir.cs.illinois.edu/astgen/">the refactoring paper</a>, my colleagues and I found many of <a href="http://eclipse.org/">Eclipse's</a> refactoring tests were either commented out, marked as ignored, or most bizarrely, bypassed using "<code>if (true) return;</code>".</p>

<p>To solve this problem, I have been exploring ways of reducing the effort required to fix broken unit tests.  Doing so would make developers less fearful of "deep" changes, allow them to write more detailed tests, and most importantly, provide time for more important work.</p>

<p>As a first step toward this goal, I developed a tool called <em>ReAssert</em> that automatically suggests changes to test code that are sufficient to make tests pass.  Earlier this week I released a public beta.  I welcome anyone reading this to download it from <a href="http://mir.cs.illinois.edu/reassert/">the ReAssert project homepage</a> and try it out.  Please <a href="http://www.brettdaniel.com/contact/">contact me</a> if you have any comments, questions, ideas for improvement, or bug reports.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2009/07/10/191923/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crunch Time</title>
		<link>http://www.brettdaniel.com/archives/2009/05/18/220240/</link>
		<comments>http://www.brettdaniel.com/archives/2009/05/18/220240/#comments</comments>
		<pubDate>Tue, 19 May 2009 03:02:40 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1247</guid>
		<description><![CDATA[Every profession has deadlines, but the culture of crunch time is particularly prevalent in high-tech fields. The tendency toward late nights and last-minute sprints is one of the few things I dislike about computer science and programming. Nearly-perfect software takes time. Even so, I have found myself buried in crunch time more often than I [...]]]></description>
			<content:encoded><![CDATA[<p>Every profession has deadlines, but the culture of crunch time is particularly prevalent in high-tech fields.  The tendency toward <a href="http://www.caffeinatedcoder.com/the-case-against-overtime/">late nights</a> and <a href="http://ea-spouse.livejournal.com/274.html">last-minute sprints</a> is one of the few things I dislike about computer science and programming.  <a href="http://www.fastcompany.com/magazine/06/writestuff.html">Nearly-perfect software</a> takes time.</p>

<p>Even so, I have found myself buried in crunch time more often than I like to admit.  Over the last month, for example, I spent many 10-plus-hour days writing my latest research paper.  I was curious how this stretch of time compared to previous research papers'.  Now that the deadline has passed, I can satisfy my curiosity by examining the papers' revision control system.  It contains every edit made to each of the <a href="http://mir.cs.uiuc.edu/~bdaniel3/">last five papers</a> I was involved in.</p>

<p>The following chart shows how the papers grew as their deadlines approached.</p>

<div class="picsholder">
<a href="http://www.brettdaniel.com/gallery/2009/paper_size_before_deadline.png"><img src="http://www.brettdaniel.com/pictures/2009/paper_size_before_deadline.s.png" alt="Research paper growth as a deadline approaches" title="Research paper growth as a deadline approaches" class="pic" /></a></div>

<p>Vertical jumps represent lines added or removed from a paper.  Horizontal plateaus represent the length of time between changes.  Crunch time is obvious in this diagram: around ten days before a deadline, a paper's growth rate increases, and the length of time between edits decreases.  For example, the last ten days of the most recent paper, shown in red, contained about 75% of the paper's total edits.</p>

<p>This number, the fraction of edits in the final ten days, creates an interesting "crunchiness" metric.  The following chart shows the metric for each of the papers.</p>

<div class="picsholder">
<a href="http://www.brettdaniel.com/gallery/2009/edits_in_final_10_days.png"><img src="http://www.brettdaniel.com/pictures/2009/edits_in_final_10_days.s.png" alt="Fraction of edits in the final ten days before a deadline" title="Fraction of edits in the final ten days before a deadline" class="pic" /></a></div>

<p>This chart echoes how I would qualitatively rank the papers: "<a href="http://mir.cs.uiuc.edu/astgen/">Automated Testing of Refactoring Engines</a>" was easily the most crunchy and "<a href="http://mir.cs.uiuc.edu/predictcoverage/">Predicting Effectiveness of Automatic Testing Tools</a>" was the least.</p>

<p>More research is needed to determine if crunchiness correlates with paper acceptance.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2009/05/18/220240/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spoon Patch</title>
		<link>http://www.brettdaniel.com/archives/2009/02/05/130502/</link>
		<comments>http://www.brettdaniel.com/archives/2009/02/05/130502/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 18:05:02 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Microblog]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/?p=1072</guid>
		<description><![CDATA[Encountered a limitation of Spoon while using it on a research project; wrote a workaround; bundled the workaround into a patch.]]></description>
			<content:encoded><![CDATA[Encountered a limitation of <a href="http://spoon.gforge.inria.fr/">Spoon</a> while using it on a research project; wrote a workaround; bundled the workaround into a <a href="http://gforge.inria.fr/tracker/index.php?func=detail&amp;aid=7256&amp;group_id=73&amp;atid=373">patch</a>.]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2009/02/05/130502/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Predicting Effectiveness of Automatic Testing Tools</title>
		<link>http://www.brettdaniel.com/archives/2008/07/03/001714/</link>
		<comments>http://www.brettdaniel.com/archives/2008/07/03/001714/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 05:17:14 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/archives/2008/07/03/001714/</guid>
		<description><![CDATA[My short paper entitled Predicting Effectiveness of Automatic Testing Tools got accepted to ASE 2008. The paper describes some of the research I did at Agitar last summer. Automatic white-box test generation is a challenging problem. Many existing tools rely on complex code analyses and heuristics. As a result, structural features of an input program [...]]]></description>
			<content:encoded><![CDATA[<p>My short paper entitled <a href="http://mir.cs.uiuc.edu/predictcoverage/predictcoverage.pdf">Predicting Effectiveness of Automatic Testing Tools</a> got accepted to <a href="http://www.di.univaq.it/ase2008/">ASE 2008</a>.  The paper describes some of the research I did at Agitar <a href="archives/2007/12/09/234130/">last summer</a>.</p>

<blockquote>

<p>Automatic white-box test generation is a challenging problem. Many existing tools rely on complex code analyses and heuristics. As a result, structural features of an input program may impact tool effectiveness in ways that tool users and designers may not expect or understand.</p>

<p>We develop a technique that uses structural program metrics to predict the test coverage achieved by three automatic test generation tools. We use coverage and structural metrics extracted from 11 software projects to train several decision tree classifiers. Our experiments show that these classifiers can predict high or low coverage with success rates of 82% to 94%.</p>

</blockquote>

<p>I posted the <a href="http://mir.cs.uiuc.edu/predictcoverage/predictcoverage-uiucdcs-r-2008-2956.pdf">original tech report</a> and other supporting information at the paper's <a href="http://mir.cs.uiuc.edu/predictcoverage/">companion site</a>.</p>

<p>Unfortunately, Agitar <a href="http://weblog.infoworld.com/openresource/archives/2008/06/hard_to_make_a.html">no</a> <a href="http://www.sdtimes.com/content/article.aspx?ArticleID=32186">longer</a> <a href="http://www.onstrategies.com/CURRENT-NEWS/Vultures-Circling-Agitar-Installed-Base.html">exists</a> despite having a mature product, many talented engineers, and a strong involvement in research.  As I understand it, the company had difficulty getting developers to adopt their software, and the recent economic troubles were too much for it.  Without Agitar to support a trip, it is unlikely that I will be able to go to Italy to present the paper in person.  I am nevertheless very pleased with the work and am glad that it will get wider exposure.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2008/07/03/001714/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load, Modify, Recompile, and Execute Java Classes with Spoon</title>
		<link>http://www.brettdaniel.com/archives/2008/04/25/181351/</link>
		<comments>http://www.brettdaniel.com/archives/2008/04/25/181351/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 23:13:51 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/archives/2008/04/25/181351/</guid>
		<description><![CDATA[I have been using Spoon as part of some recent research. Spoon allows one to analyze and transform Java source code using a very elegant abstract syntax tree library and several parsing and compiling tools. Spoon assumes that one writes "processors" that act on all occurrences of a particular program element prior to compilation and [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using <a href="http://spoon.gforge.inria.fr/">Spoon</a> as part of some recent research.  Spoon allows one to analyze and transform Java source code using a very elegant abstract syntax tree library and several parsing and compiling tools.  Spoon assumes that one writes "processors" that act on all occurrences of a particular program element prior to compilation and execution.  I required a different approach for my project.  Rather than transforming code prior to compilation, I needed to load classes, modify their source code, recompile the changes, and execute the modified code at runtime.  I found that there is very little online documentation describing this usage, so I posted my solution <a href="http://mir.cs.uiuc.edu/~bdaniel3/spoonloader/">over on my research site</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2008/04/25/181351/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accepted!</title>
		<link>http://www.brettdaniel.com/archives/2007/06/01/235229/</link>
		<comments>http://www.brettdaniel.com/archives/2007/06/01/235229/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 04:52:29 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Grad School]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/archives/2007/06/01/235229/</guid>
		<description><![CDATA[The FSE paper got accepted! We got a lot of great comments from the reviewers, so for the next few weeks we will make the final changes to ready the paper for publication. Publication! I'm going to Croatia!]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.brettdaniel.com/archives/2007/03/24/180341/">FSE paper</a> got accepted!  We got a lot of great comments from the reviewers, so for the next few weeks we will make the final changes to ready the paper for publication. Publication! I'm going to Croatia!</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2007/06/01/235229/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ICSE 2007</title>
		<link>http://www.brettdaniel.com/archives/2007/05/27/192915/</link>
		<comments>http://www.brettdaniel.com/archives/2007/05/27/192915/#comments</comments>
		<pubDate>Mon, 28 May 2007 00:29:15 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Grad School]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/archives/2007/05/27/192915/</guid>
		<description><![CDATA[Last week I passed another grad school milestone: I went to ICSE 2007, my first research conference. I do not think I could have had a better first conference. ICSE is one of the top three or four software engineering conferences in the world, and attracts some excellent submissions. I arrived Tuesday night and spent [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I passed <a href="http://www.brettdaniel.com/archives/2007/03/24/180341/">another</a> grad school milestone: I went to <a href="http://web4.cs.ucl.ac.uk/icse07/">ICSE 2007</a>, my first research conference.</p>

<div class="picsholder">
<a href="http://www.brettdaniel.com/gallery/?path=pictures/2007/meaticse2007.jpg"><img src="http://www.brettdaniel.com/thumb.php?width=300&amp;path=pictures/2007/meaticse2007.jpg" alt="Me standing in front of the ICSE 2007 conference sign" title="Me standing in front of the ICSE 2007 conference sign" class="pic" />
</a>
</div>

<p>I do not think I could have had a better first conference.   ICSE is one of the top three or four software engineering conferences in the world, and attracts some excellent submissions.  I arrived Tuesday night and spent the next four days listening to many interesting talks (and, of course, a few boring ones) and networking with other researchers.  I saw too many great ideas and met too many smart people to describe in this short weblog post; check out the <a href="http://web4.cs.ucl.ac.uk/icse07/index.php?id=98">list of papers and presenters</a> if you are interested.</p>

<p>We spent most of our time in the hotel conference center, but I did get a chance to see some of the rest of Minneapolis.  On Thursday, the conference dinner was held at <a href="http://nicolletisland.com/photogallery.shtml">Nicollet Island</a>, a historic park in the middle of the Mississippi River.  There, one could try hatchet throwing, archery, or a <a href="http://www.segway.com/">Segway</a>.  I hit the hatchet target after only three tries, but did not get a chance to shoot an arrow or ride a Segway because the Minnesota cold drove me back indoors.  Has my short time in California made me so thin-skinned?</p>

<p>On Saturday night, after a long day at the <a href="http://cms.brookes.ac.uk/staff/HongZhu/ASTworkshops/AST2007/">Automated Software Test Workshop</a>, I went with a small group to the <a href="http://www.mallofamerica.com/">Mall of America</a>.  We ate dinner at a <a href="http://www.rainforestcafe.com/">completely ridiculous rainforest-themed restaurant</a> whose walls were covered in jungle foliage and animatronic animals with servers dressed as safari guides.  After that, we walked around, basking in the glow of American consumerism.</p>  ]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2007/05/27/192915/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publication</title>
		<link>http://www.brettdaniel.com/archives/2007/03/24/180341/</link>
		<comments>http://www.brettdaniel.com/archives/2007/03/24/180341/#comments</comments>
		<pubDate>Sat, 24 Mar 2007 23:03:41 +0000</pubDate>
		<dc:creator>Brett</dc:creator>
				<category><![CDATA[Grad School]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://www.brettdaniel.com/archives/2007/03/24/180341/</guid>
		<description><![CDATA[Last Monday I passed an important milestone in my graduate career: I submitted my first paper for publication. It is called "Automated Testing of Refactoring Engines", and we submitted it to FSE 2007. The project website contains our bug reports and experimental data. I am very excited about this paper. Not only is it the [...]]]></description>
			<content:encoded><![CDATA[<p>Last Monday I passed an important milestone in my graduate career: I submitted my first paper for publication.  It is called "<a href="http://mir.cs.uiuc.edu/astgen/astgen.pdf">Automated Testing of Refactoring Engines</a>", and we submitted it to <a href="http://www.idt.mdh.se/esec-fse-2007/">FSE 2007</a>.  <a href="http://mir.cs.uiuc.edu/astgen/">The project website</a> contains our bug reports and experimental data.</p>

<p>I am very excited about this paper. Not only is it the culmination of the work I have been doing since last August, but I was fortunate enough to be first author.  I feel we have some very strong results and a great point from which to continue future work.  Now we need to forget about this submission and concentrate on the next conference.</p>

<h3>Update</h3>

<p>The paper was <a href="http://www.brettdaniel.com/archives/2007/06/01/235229/">accepted</a>!</p>]]></content:encoded>
			<wfw:commentRss>http://www.brettdaniel.com/archives/2007/03/24/180341/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

