001 package ps1.test; 002 003 import ps1.*; 004 005 import junit.framework.*; 006 007 /** 008 * This class contains a set of test cases that can be used to test the 009 * implementation of the RatPolyStack class. 010 * <p> 011 */ 012 public final class RatPolyStackTest extends TestCase { 013 // create a new poly that is a constant (doesn't depend on x) 014 private RatPoly constantPoly(int constant) { 015 return new RatPoly(constant, 0); 016 } 017 018 // create a new poly that is a constant (doesn't depend on x) 019 // taking a char allows us to represent stacks as strings 020 private RatPoly constantPoly(char constant) { 021 return constantPoly(Integer.valueOf("" + constant).intValue()); 022 } 023 024 // * @return a new RatPolyStack instance 025 private RatPolyStack stack() { 026 return new RatPolyStack(); 027 } 028 029 // create stack of single-digit constant polys 030 private RatPolyStack stack(String desc) { 031 RatPolyStack s = new RatPolyStack(); 032 033 // go backwards to leave first element in desc on _top_ of stack 034 for (int i = desc.length() - 1; i >= 0; i--) { 035 char c = desc.charAt(i); 036 s.push(constantPoly(c)); 037 } 038 return s; 039 } 040 041 // RatPoly equality check 042 // (getting around non-definition of RatPoly.equals) 043 private boolean eqv(RatPoly p1, RatPoly p2) { 044 return p1.toString().equals(p2.toString()); 045 } 046 047 // compares 's' to a string describing its values 048 // thus stack123 = "123". desc MUST be a sequence of 049 // decimal number chars 050 // 051 // NOTE: THIS CAN FAIL WITH A WORKING STACK IF RatPoly.toString IS BROKEN! 052 private void assertStackIs(RatPolyStack s, String desc) { 053 assertTrue(s.size() == desc.length()); 054 055 for (int i = 0; i < desc.length(); i++) { 056 RatPoly p = s.getNthFromTop(i); 057 char c = desc.charAt(i); 058 String asstr = "Elem(" + i + "): " + p.toString() + ", Expected " 059 + c + ", (Expected Stack:" + desc + ")"; 060 061 assertTrue(asstr, eqv(p, constantPoly(c))); 062 } 063 } 064 065 public RatPolyStackTest(String name) { 066 super(name); 067 } 068 069 public void testCtor() { 070 RatPolyStack stk1 = stack(); 071 assertTrue(stk1.size() == 0); 072 } 073 074 public void testPush() { 075 RatPolyStack stk1 = stack(); 076 stk1.push(constantPoly(0)); 077 078 assertStackIs(stk1, "0"); 079 080 stk1.push(constantPoly(0)); 081 assertStackIs(stk1, "00"); 082 083 stk1.push(constantPoly(1)); 084 assertStackIs(stk1, "100"); 085 086 stk1 = stack("3"); 087 assertStackIs(stk1, "3"); 088 089 stk1 = stack("23"); 090 assertStackIs(stk1, "23"); 091 092 stk1 = stack("123"); 093 assertStackIs(stk1, "123"); 094 } 095 096 public void testPushCheckForSharingTwixtStacks() { 097 RatPolyStack stk1 = stack(); 098 RatPolyStack stk2 = stack("123"); 099 assertStackIs(stk1, ""); 100 assertStackIs(stk2, "123"); 101 102 stk1.push(constantPoly(0)); 103 assertStackIs(stk1, "0"); 104 assertStackIs(stk2, "123"); 105 106 stk1.push(constantPoly(0)); 107 assertStackIs(stk1, "00"); 108 assertStackIs(stk2, "123"); 109 110 stk1.push(constantPoly(1)); 111 assertStackIs(stk1, "100"); 112 assertStackIs(stk2, "123"); 113 114 stk2.push(constantPoly(8)); 115 assertStackIs(stk1, "100"); 116 assertStackIs(stk2, "8123"); 117 } 118 119 public void testPop() { 120 RatPolyStack stk1 = stack("123"); 121 122 RatPoly poly = stk1.pop(); 123 assertTrue(eqv(poly, constantPoly(1))); 124 assertStackIs(stk1, "23"); 125 126 poly = stk1.pop(); 127 assertTrue(eqv(poly, constantPoly(2))); 128 assertStackIs(stk1, "3"); 129 130 poly = stk1.pop(); 131 assertStackIs(stk1, ""); 132 } 133 134 public void testDup() { 135 RatPolyStack stk1 = stack("3"); 136 stk1.dup(); 137 assertStackIs(stk1, "33"); 138 139 stk1 = stack("23"); 140 stk1.dup(); 141 assertStackIs(stk1, "223"); 142 assertTrue(stk1.size() == 3); 143 assertTrue(eqv(stk1.getNthFromTop(0), constantPoly(2))); 144 assertTrue(eqv(stk1.getNthFromTop(1), constantPoly(2))); 145 assertTrue(eqv(stk1.getNthFromTop(2), constantPoly(3))); 146 147 stk1 = stack("123"); 148 stk1.dup(); 149 assertStackIs(stk1, "1123"); 150 151 } 152 153 public void testSwap() { 154 RatPolyStack stk1 = stack("23"); 155 stk1.swap(); 156 assertStackIs(stk1, "32"); 157 158 stk1 = stack("123"); 159 stk1.swap(); 160 assertStackIs(stk1, "213"); 161 162 stk1 = stack("112"); 163 stk1.swap(); 164 assertStackIs(stk1, "112"); 165 } 166 167 public void testClear() { 168 RatPolyStack stk1 = stack("123"); 169 stk1.clear(); 170 assertStackIs(stk1, ""); 171 RatPolyStack stk2 = stack("112"); 172 stk2.clear(); 173 assertStackIs(stk2, ""); 174 } 175 176 public void testAdd() { 177 RatPolyStack stk1 = stack("123"); 178 stk1.add(); 179 assertStackIs(stk1, "33"); 180 stk1.add(); 181 assertStackIs(stk1, "6"); 182 183 stk1 = stack("112"); 184 stk1.add(); 185 assertStackIs(stk1, "22"); 186 stk1.add(); 187 assertStackIs(stk1, "4"); 188 stk1.push(constantPoly(5)); 189 assertStackIs(stk1, "54"); 190 stk1.add(); 191 assertStackIs(stk1, "9"); 192 193 } 194 195 public void testSub() { 196 RatPolyStack stk1 = stack("123"); 197 stk1.sub(); 198 assertStackIs(stk1, "13"); 199 stk1.sub(); 200 assertStackIs(stk1, "2"); 201 202 stk1 = stack("5723"); 203 stk1.sub(); 204 assertStackIs(stk1, "223"); 205 stk1.sub(); 206 assertStackIs(stk1, "03"); 207 stk1.sub(); 208 assertStackIs(stk1, "3"); 209 } 210 211 public void testMul() { 212 RatPolyStack stk1 = stack("123"); 213 stk1.mul(); 214 assertStackIs(stk1, "23"); 215 stk1.mul(); 216 assertStackIs(stk1, "6"); 217 218 stk1 = stack("112"); 219 stk1.mul(); 220 assertStackIs(stk1, "12"); 221 stk1.mul(); 222 assertStackIs(stk1, "2"); 223 stk1.push(constantPoly(4)); 224 assertStackIs(stk1, "42"); 225 stk1.mul(); 226 assertStackIs(stk1, "8"); 227 } 228 229 public void testDiv() { 230 RatPolyStack stk1 = stack("123"); 231 stk1.div(); 232 assertStackIs(stk1, "23"); 233 } 234 235 public void testDifferentiate() { 236 RatPolyStack stk1 = stack("123"); 237 stk1.differentiate(); 238 stk1.differentiate(); 239 stk1.differentiate(); 240 stk1.differentiate(); 241 assertTrue("Test if stack size changes", stk1.size() == 3); 242 assertStackIs(stk1, "023"); 243 244 RatPoly rp1 = new RatPoly(3, 5); 245 RatPoly rp2 = new RatPoly(7, 0); 246 RatPoly rp3 = new RatPoly(4, 1); 247 stk1.push(rp1); 248 stk1.push(rp2); 249 stk1.push(rp3); 250 251 stk1.differentiate(); 252 assertTrue("Test simple differentiate1", stk1.pop().toString().equals( 253 "4")); 254 stk1.differentiate(); 255 assertTrue("Test simple differentiate2", stk1.pop().toString().equals( 256 "0")); 257 stk1.differentiate(); 258 assertTrue("Test simple differentiate3", stk1.pop().toString().equals( 259 "15*x^4")); 260 } 261 262 public void testIntegrate() { 263 RatPolyStack stk1 = stack("123"); 264 stk1.integrate(); 265 stk1.integrate(); 266 stk1.integrate(); 267 stk1.integrate(); 268 assertTrue("Test if stack size changes", stk1.size() == 3); 269 assertTrue("Test simple integrate1", stk1.pop().toString().equals( 270 "1/24*x^4")); 271 RatPoly rp1 = new RatPoly(15, 4); 272 RatPoly rp2 = new RatPoly(7, 0); 273 RatPoly rp3 = new RatPoly(4, 0); 274 stk1.push(rp1); 275 stk1.push(rp2); 276 stk1.push(rp3); 277 278 stk1.integrate(); 279 assertTrue("Test simple integrate1", stk1.pop().toString() 280 .equals("4*x")); 281 stk1.integrate(); 282 assertTrue("Test simple integrate2", stk1.pop().toString() 283 .equals("7*x")); 284 stk1.integrate(); 285 assertTrue("Test simple integrate3", stk1.pop().toString().equals( 286 "3*x^5")); 287 } 288 289 // Tell JUnit what order to run the tests in 290 public static Test suite() { 291 TestSuite suite = new TestSuite(); 292 suite.addTest(new RatPolyStackTest("testCtor")); 293 suite.addTest(new RatPolyStackTest("testPush")); 294 suite 295 .addTest(new RatPolyStackTest( 296 "testPushCheckForSharingTwixtStacks")); 297 suite.addTest(new RatPolyStackTest("testPop")); 298 suite.addTest(new RatPolyStackTest("testDup")); 299 suite.addTest(new RatPolyStackTest("testSwap")); 300 suite.addTest(new RatPolyStackTest("testClear")); 301 suite.addTest(new RatPolyStackTest("testAdd")); 302 suite.addTest(new RatPolyStackTest("testSub")); 303 suite.addTest(new RatPolyStackTest("testMul")); 304 suite.addTest(new RatPolyStackTest("testDiv")); 305 suite.addTest(new RatPolyStackTest("testDifferentiate")); 306 suite.addTest(new RatPolyStackTest("testIntegrate")); 307 return suite; 308 } 309 }