Re: Re: Spindle compatability test suite

Hugo Palma <[email protected]> Sat, 13 May 2006 22:41:17 +0100
Newsgroups gmane.comp.ide.eclipse.spindle.devel
Message-ID <[email protected]>
Ok, i've uploaded the files. I used the tapidea svn repo for this.
You have web access to it, if you like, here 
http://svn.javaforge.com/svn/tapidea/spindle-test-suite/trunk/.
You can also find my(unfinished) implementation of IFixture here 
http://svn.javaforge.com/svn/tapidea/tapidea-core/trunk/src/main/java/org/intellij/tapestry/test/Fixture.java.

I thought a little more about the tested classes implementation issue 
and i think i came up with a much better solution. Instead of having to 
declare a service for each tested class i think we can assume that if we 
have the IDE specific implementation of ITapestryProject and 
TapestryCore we can get any other instance of a class that we want to 
test from that. The current implementation only gets the 
ITapestryProject implementation but a similiar approach can be taken to 
get the TapestryCore impl.
Do you think this assumption is correct ?



Geoff Longman wrote:
> Ok. I see what you have. A fixture is an interface to build a
> "project" with context and classpath for testing. Can provide or point
> me to (in you repo) an example of a Test?
>
>
> On 5/10/06, Hugo Palma <[email protected]> wrote:
>> Forgot to mention how the tested class implementation would be served to
>> the test class.
>
> ok, I'm lost at this point. "tested class implementation" is?
>
>
> Geoff
>
>> I got this working by declaring a hivemind service for each tested class
>> in spindle-tests and then providing the implementation in the IDE
>> implementation module. There's also an utility method in
>> AbstractSpindleTestCase that gets the tested class implementation.
>> I'm not crazy about having to declare every tested class in the hivemind
>> descriptor but i couldn't find a better way of doing this.
>>
>>
>> Hugo Palma wrote:
>> > I told you i wouldn't let you forget about this :o)
>> >
>> > I took advantage of a few dead hours in my day job to give this some
>> > thought. After some experimenting i came up with some ideas and some
>> > code also.
>> >
>> > There should be a separate module(spindle-tests) with all the
>> > framework classes and the tests themselves.
>> >
>> > The framework consists of one interface, one class and one hivemind
>> > descriptor. The interface is IFixture, it provides the signature for
>> > all operations that can be executed in a fixture. A fresh instance of
>> > the fixture will be provided to each test class at every test run.
>> > I've come up with the following code for now, still some operations
>> > missing but good for getting the main picture:
>> >
>> > /**
>> >  * A test fixture. Should have an implementation for each IDE.
>> >  */
>> > public interface IFixture<W, F>
>> > {
>> >     /**
>> >      * Adds a web root.
>> >      *
>> >      * @param filePath     the absolute path to the web root 
>> directory.
>> >      * @param relativePath the relative path of the web root. Some
>> > IDEs let the user specify a different relative path for each web root,
>> > changing the default "/" path.
>> >      * @return the added web root.
>> >      */
>> >     W addWebRoot(String filePath, String relativePath);
>> >
>> >     /**
>> >      * Adds a web root with the default "/" relative path.
>> >      *
>> >      * @param filePath the absolute path to the web root directory.
>> >      * @return the added web root.
>> >      */
>> >     W addWebRoot(String filePath);
>> >
>> >     /**
>> >      * Adds an empty file to a web root.
>> >      *
>> >      * @param webRoot the web root to add the file to.
>> >      * @param path    the absolute path of the file to be added.
>> >      * @return the added file.
>> >      */
>> >     F addFileToWebRoot(W webRoot, String path);
>> >
>> >     /**
>> >      * Adds a source root.
>> >      *
>> >      * @param filePath the absolute path to the source root directory.
>> >      * @return the added source root.
>> >      */
>> >     F addSourceRoot(String filePath);
>> >
>> >     /**
>> >      * Adds an empty class to a source root.
>> >      *
>> >      * @param root        the source root to add the class to.
>> >      * @param packageName the class package.
>> >      * @param className   the class name.
>> >      */
>> >     void addClassToSourceRoot(F root, String packageName, String
>> > className);
>> >
>> >     /**
>> >      * Adds a .jar file to the classpath.
>> >      *
>> >      * @param jarFile the .jar file to add to the classpath.
>> >      */
>> >     void addJarToClasspath(F jarFile);
>> >
>> >     /**
>> >      * Adds a file to a source root.
>> >      *
>> >      * @param root        the source root to add the file to.
>> >      * @param packageName the package to add the file to.
>> >      * @param fileName    the absolute path to the file to be added.
>> >      */
>> >     void addFileToSourceRoot(F root, String packageName, String
>> > fileName);
>> >
>> >     /**
>> >      * Tears down the fixture.
>> >      */
>> >     void tearDown();
>> > }
>> >
>> >
>> > The base class for all tests is also provided. I called it
>> > AbstractSpindleTestCase. This class provides a getFixture() method to
>> > every subclass and is responsible for getting the fresh fixture
>> > instance from Hivemind at every test run. Here's the code i came up 
>> with:
>> >
>> > /**
>> >  * Base class for all test classes.
>> >  *
>> >  * @author Hugo Palma
>> >  */
>> > public abstract class AbstractSpindleTestCase extends TestCase
>> > {
>> >     private IFixture _fixture;
>> >     private static Registry _registry;
>> >
>> >     {
>> >         _registry = RegistryBuilder.constructDefaultRegistry();
>> >     }
>> >
>> >     /**
>> >      * {@inheritDoc}
>> >      */
>> >     protected void setUp() throws Exception
>> >     {
>> >         super.setUp();
>> >
>> >         // Allows getting a brand new IFixture instance every time.
>> >         _registry.cleanupThread();
>> >         _registry.setupThread();
>> >
>> >         _fixture = (IFixture) _registry.getService(IFixture.class );
>> >     }
>> >
>> >     /**
>> >      * {@inheritDoc}
>> >      */
>> >     protected void tearDown() throws Exception
>> >     {
>> >         super.tearDown();
>> >
>> >         // Cleanup the fixture.
>> >         _fixture.tearDown();
>> >         _fixture = null;
>> >     }
>> >
>> >     protected IFixture getFixture()
>> >     {
>> >         return _fixture;
>> >     }
>> > }
>> >
>> > The only thing missing is the hivemodule.xml in the spindle-tests 
>> module:
>> >
>> > <module id=" net.sf.spindle.tests" version="1.0.0">
>> >     <service-point id="fixture"
>> > interface="net.sf.spindle.tests.IFixture"/>
>> > </module>
>> >
>> > So, given this, all the IDE has to do is:
>> >
>> > - Create an implementation of the IFixture interface.
>> > - Provide a hivemodule.xml file in it's spindle-core implementation
>> > module with something like:
>> >
>> >   <module id="org.intellij.tapestry" version=" 1.0.0">
>> >     <dependency module-id="net.sf.spindle.tests" version="1.0.0"/>
>> >
>> >     <implementation service-id="net.sf.spindle.tests.fixture">
>> >         <invoke-factory model="threaded">
>> >             <construct class="org.intellij.tapestry.test.Fixture"/>
>> >         </invoke-factory>
>> >     </implementation>
>> > </module>
>> > - Execute the tests. I managed to run the tests from IDEA with no
>> > problem. I'm going to see how/if i can run tests from a jar file with
>> > Maven2.
>> >
>> >
>> > Thoughts ?
>>
>>
>> -------------------------------------------------------
>> Using Tomcat but need to do more? Need to support web services, 
>> security?
>> Get stuff done quickly with pre-integrated technology to make your 
>> job easier
>> Download IBM WebSphere Application Server v.1.0.1 based on Apache 
>> Geronimo
>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
>> _______________________________________________
>> Spindle-developer mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/spindle-developer
>>
>
>


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642