001 /**
002 * This is part of the Problem Set 0: Introduction for CSE 331.
003 */
004 package ps0.test;
005 import ps0.*;
006 import java.util.Set;
007 import java.util.HashSet;
008
009 import junit.framework.TestCase;
010
011 /**
012 * BallContainerTest is a glassbox test of the BallContainer class.
013 *
014 * Recall that the BallContainer is a container for Balls. However, you can only
015 * put a Ball into a BallContainer once. After you put the Ball into the BallContainer,
016 * further attempts to do so will fail, since the Ball is already in
017 * the BallContainer! Similarly, you cannot expect to remove a Ball from a BallContainer
018 * if it is not inside the BallContainer.
019 *
020 * @see ps0.Ball
021 * @see ps0.BallContainer
022 */
023 public class BallContainerTest extends TestCase {
024
025 private BallContainer ballcontainer = null;
026 private int NUM_BALLS_TO_TEST = 3;
027 private Ball[] b = null;
028 private double BALL_UNIT_VOLUME = 20.0;
029 private double JUNIT_DOUBLE_DELTA = 0.0001;
030
031 protected void setUp() throws Exception {
032 assertEquals("Test case error, you must test at least 1 Ball!!", true, NUM_BALLS_TO_TEST > 0);
033 ballcontainer = new BallContainer();
034
035 // Let's create the balls we need.
036 b = new Ball[NUM_BALLS_TO_TEST];
037 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
038 b[i] = new Ball((i+1)*BALL_UNIT_VOLUME);
039 }
040 }
041
042
043 /** Test to check that BallContainer.add(Ball) is implemented correctly */
044 public void testAdd() {
045 double containerVolume;
046 ballcontainer.clear();
047 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
048 assertEquals("BallContainer.add(Ball) failed to add a new Ball!", true, ballcontainer.add(b[i]));
049 containerVolume = ballcontainer.getVolume();
050 assertEquals("BallContainer.add(Ball) seems to allow the same Ball to be added twice!", false, ballcontainer.add(b[i]));
051 assertEquals("BallContainer's volume has changed, but its contents have not!",containerVolume,ballcontainer.getVolume());
052 assertEquals("BallContainer does not contain a ball after it is supposed to have been added!", true, ballcontainer.contains(b[i]));
053 }
054 }
055
056 /** Test to check that BallContainer.remove(Ball) is implemented correctly */
057 public void testRemove() {
058 ballcontainer.clear();
059 double containerVolume;
060 assertEquals("BallContainer.remove(Ball) should fail because ballcontainer is empty, but it didn't!", false, ballcontainer.remove(b[0]));
061 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
062 ballcontainer.clear();
063 for (int j=0; j<i; j++) {
064 ballcontainer.add(b[j]);
065 }
066 for (int j=0; j<i; j++) {
067 assertEquals("BallContainer.remove(Ball) failed to remove a Ball that is supposed to be inside", true, ballcontainer.remove(b[j]));
068 containerVolume = ballcontainer.getVolume();
069 assertEquals("BallContainer still contains a ball after it is supposed to have been removed!", false, ballcontainer.contains(b[j]));
070 assertEquals("BallContainer's volume has changed, but its contents have not!",containerVolume,ballcontainer.getVolume());
071 }
072 for (int j=i; j<NUM_BALLS_TO_TEST; j++) {
073 assertEquals("BallContainer.remove(Ball) did not fail for a Ball that is not inside", false, ballcontainer.remove(b[j]));
074 }
075 }
076 }
077
078 /**
079 * Test to check that BallContainer.iterator() is implemented
080 * correctly.
081 */
082 public void testIterator() {
083 Set<Ball> allBalls = new HashSet<Ball>();
084 Set<Ball> seenBalls = new HashSet<Ball>();
085 ballcontainer.clear();
086 assertEquals("BallContainer is not empty after being cleared!", 0, ballcontainer.size());
087 for (Ball aBall: b) {
088 ballcontainer.add(aBall);
089 allBalls.add(aBall);
090 }
091 int i=0;
092 for (Ball aBall: ballcontainer) {
093 assertTrue("Iterator returned a ball which isn't in the container",
094 allBalls.contains(aBall));
095 assertFalse("Iterator returned the same ball twice",
096 seenBalls.contains(aBall));
097 seenBalls.add(aBall);
098 i++;
099 }
100 assertEquals("BallContainer iterator did not return enough items!", i, b.length);
101 }
102
103 /**
104 * Test that BallContainer.clear() is implemented correctly.
105 */
106 public void testClear() {
107 ballcontainer.clear();
108 assertEquals("BallContainer is not empty after being cleared!", 0, ballcontainer.size());
109 ballcontainer.add(b[0]);
110 ballcontainer.clear();
111 assertEquals("BallContainer is not empty after being cleared!", 0, ballcontainer.size());
112 }
113
114 /** Test that we can put a Ball into a BallContainer */
115 public void testVolume() {
116 ballcontainer.clear();
117 assertEquals("Volume of empty BallContainer is not zero!", 0, ballcontainer.getVolume(), JUNIT_DOUBLE_DELTA);
118 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
119 ballcontainer.add(b[i]);
120 assertEquals("Volume of BallContainer with "+(i+1)+" ball(s) is supposed to be "+((i+1)*(i+2)*BALL_UNIT_VOLUME/2)+" but it's "
121 +ballcontainer.getVolume()+" instead", (i+1)*(i+2)*BALL_UNIT_VOLUME/2, ballcontainer.getVolume(), JUNIT_DOUBLE_DELTA);
122 }
123
124 }
125
126 /** Test that size() returns the correct number. */
127 public void testSize() {
128 ballcontainer.clear();
129 assertEquals("size() of empty BallContainer is not zero!", 0, ballcontainer.size());
130 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
131 ballcontainer.add(b[i]);
132 assertEquals("size() of BallContainer with "+(i+1)+" ball(s) is supposed to be "+(i+1)+" but it's "
133 +ballcontainer.size()+" instead", i+1, ballcontainer.size());
134 }
135 }
136
137 /** Test that size() returns the correct number. */
138 public void testContains() {
139 ballcontainer.clear();
140 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
141 assertEquals("Empty BallContainer seems to contain a ball!", false, ballcontainer.contains(b[i]));
142 }
143 for (int i=0; i<NUM_BALLS_TO_TEST; i++) {
144 ballcontainer.add(b[i]);
145 assertEquals("BallContainer does not contain a Ball that is supposed to be inside!", true, ballcontainer.contains(b[i]));
146 for (int j=i+1; j<NUM_BALLS_TO_TEST; j++) {
147 assertEquals("BallContainer seems to contain a Ball that is not inside!", false, ballcontainer.contains(b[j]));
148 }
149 }
150 }
151
152 /** Test that clear removes all balls. **/
153 public void testVolumeAfterClear() {
154 ballcontainer.add(b[0]);
155 ballcontainer.clear();
156 assertEquals("The volume of BallContainer after being cleared is not reset to 0!",
157 0,ballcontainer.getVolume(),JUNIT_DOUBLE_DELTA);
158 }
159
160 }