File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Testing and the fly likes how to test drive this problem? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login

Win a copy of Make it so: Java DB Connections & Transactions this week in the JDBC forum!
JavaRanch » Java Forums » Engineering » Testing
Bookmark "how to test drive this problem?" Watch "how to test drive this problem?" New topic

how to test drive this problem?

Piotr Trochim
Ranch Hand

Joined: Dec 29, 2006
Posts: 35

I have the following story to implement - I need to be able to build a scene in a game based on its predefined representation.

On one hand I have my scene - that contains the definition of:
- the terrain
- lights
- cameras
- players

On the other hand, there's this factory that knows just how to "create" them in the 3D engine I'm using.

Now - I tried several approaches, and each time I finish the refactionring after the first iteration, I end up with stuff I started

Would somebody please be willing to show me how to evolve the whole thing through the tests?
If so, then start evolving the code from scratch - meaning that you should evolve the scene definition and the factory I mentioned as well.

Thank you so very much

Jeanne Boyarsky
author & internet detective

Joined: May 26, 2003
Posts: 32844

Why don't we start with what you did. What kinds of tests did you write?

[OCA 8 book] [Blog] [JavaRanch FAQ] [How To Ask Questions The Smart Way] [Book Promos]
Other Certs: SCEA Part 1, Part 2 & 3, Core Spring 3, TOGAF part 1 and part 2
Piotr Trochim
Ranch Hand

Joined: Dec 29, 2006
Posts: 35

Here is one of the approaches I had - it's not that bad and I think it is a way to go, but if you could take a look at it and tell me what did I screw up, that'd be great.

A word of information - in the Red Phase I always use pseudocode to get my idea down onto the paper, then I translate it and make it work during the Green Phase.

Iteration 1, phase Red

I want to be able to create something on my scene - let that something be a terrain.

... hmmmm - how to test that... - I don't want to get the implementation of how I create a terain in a particualr 3d Engine involved yet...

... Yet another approach ....

.. ok - at least this time I had a clear testing point...

Iteration 1, phase Green

The shortest steps to get things working....


Iteration 1, phase Refactoring

I messed it up quite badly - the code smells.

The Terrain class is just a marker - it's used only in the test - I'll remove it for now

Ok - seems kinda clean. I have my scene definition captured in one class, the way it should be built in the other ... Let's move on.

Iteration 2, phase Red

I want to be able to add not only the terrain, but also the light to the scene.

Iteration 2, phase Green

Ok - it's working. Now for some refactoring...

Iteration 2, phase Refactoring

I don't like it - Open-Close principle's good name is being dragged throught the mud here.
I''m expecting all kinds of different entities here, and I can't keep adding methods each time a new one comes up...

One more thing - I noticed that I needed to introduce exactly the same change to the factory as the one I introduced to the SceneDefinition.
Maybe their responsibilities are not so well separated after all...

Basically, after applying DIP I get the following code, where instead of having a factory, I end up with a bunch of creators that can handle particular objects creation process.

Everything works, and now I don't have to worry about breaking the OCP any more.

BUT - what I ended up with - I mean the SceneDefinition - that's just a wrapping for a list - does nothing more but store the creators and run a create on them all - it resembles more of a Compound then some separate entity - so I'll evolve it towards that...

Ok - now that's more like it

So basically that's my story. I can now create those things dinamically based on some arbitrary representation using parsers etc..

What do you think? Is it ok?

I agree. Here's the link:
subject: how to test drive this problem?
It's not a secret anymore!