Contents [0/5] |
To Hand In [1/5] |
Comment on integration tests [2/5] |
Comment on implementing iterators [3/5] |
Comment on testing iterators [4/5] |
Comment on the use of Commands [5/5] |
To Hand In [1/5] |
The basics.
src
directory
correctly.
Notes
Comment on integration tests [2/5] |
A nice way to generate an integration test (like myhw2.main.TEST1): + write a driver with some print statements, like this: System.out.println(Data.inventory().get(v1)); which may output something like Title1 (2000) : Director1 [10,0,0] + read the output to check it and make sure it's okay + then replace the System.output with an assert: Assert.assertEquals("Title1 (2000) : Director1 [10,0,0]", Data.inventory().get(v1).toString()); Now you can run the test over and over and it will make sure that the output is always what you got the time you checked it.
Comment on implementing iterators [3/5] |
For InventorySet.iterator(), it's easy just return Collections.unmodifiableCollection(_data.values()).iterator(); For InventorySet.iterator(Comparator c), it is a bit more delicate. Here's one way: + Create a separate copy in a list, for example List l = new ArrayList(_data.values()) + Sort the list using Collections.sort(List,Comparator) + Return an iterator over the sorted list
Comment on testing iterators [4/5] |
How to test InventorySet.iterator(), where we don't know the order... + Create a local HashSet<Video> and an InventorySet. + Put some videos in the InventorySet. + Put corresponding Videos in the HashSet. Use Video, not Record, since you cannot create records directly. You could also use strings such as "Title1 (2000) : Director1 [10,0,0]" + Now call InventorySet.iterator() and go through the elements. For each record returned do the following: ++ Make sure an equivalent video is in the local HashSet ++ Remove the equivalent video from the HashSet + Once you're done with the iterator, make sure the local HashSet is empty. To test InventorySet.iterator(), where we do know the order ... + Create class that implements Comparator. When called, the arguments will be Records. For example, the following class will compare Records based on the number owned: Class NumOwnedComparator implements java.util.Comparator { public int compare (Object o1, Object o2) { Record r1 = (Record)o1; Record r2 = (Record)o2; return r2.numOwned() - r1.numOwned(); } } or use the following in Java 1.5 to get rid of "unchecked conversion" warnings: class NumOwnedComparator implements java.util.Comparator<Record> { public int compare (Record r1, Record r2) { return r2.numOwned() - r1.numOwned(); } } + Continue as before, but this time use a List to keep the videos in expected order. If you want some more reading about Comparators/Comparable see: Making Java Objects Comparable by Budi Kurniawan http://www.onjava.com/pub/a/onjava/2003/03/12/java_comp.html
Comment on the use of Commands [5/5] |
Here is one scenario --- running an add command --- from line 31 of myhw2.main.TEST1: 00029: Video v1 = Data.newVideo("Title1", 2000, "Director1"); 00031: Assert.assertTrue(Data.newAddCmd(_inventory, v1, 5).run()); The objects involved are: +-----------+ +----------------+ +------------------+ +--------------+ | t : TEST1 | | c : CmdAdd | | i : InventorySet | | v : VideoObj | | --------- | | ---------- | | ---------------- | | ------------ | +-----------+ +----------------+ +------------------+ +--------------+ | inventory = i | | video = v | | change = 5 | +----------------+ Execution proceeds as follows: t calls c.run(); c calls i.addNumOwned(v,5)
Revised: 2008/01/22 15:43