001/* 002 * $Id: WordTest.java 4188 2012-09-13 11:40:22Z kredel $ 003 */ 004 005package edu.jas.poly; 006 007 008import java.util.Collection; 009import java.util.List; 010import java.util.SortedMap; 011import java.util.Arrays; 012 013import junit.framework.Test; 014import junit.framework.TestCase; 015import junit.framework.TestSuite; 016 017import org.apache.log4j.BasicConfigurator; 018 019 020/** 021 * Word and WordFactory tests with JUnit. Tests construction and arithmetic 022 * operations. 023 * @author Heinz Kredel. 024 */ 025 026public class WordTest extends TestCase { 027 028 029 /** 030 * main. 031 */ 032 public static void main(String[] args) { 033 BasicConfigurator.configure(); 034 junit.textui.TestRunner.run(suite()); 035 } 036 037 038 /** 039 * Constructs a <CODE>WordTest</CODE> object. 040 * @param name String. 041 */ 042 public WordTest(String name) { 043 super(name); 044 } 045 046 047 /** 048 */ 049 public static Test suite() { 050 TestSuite suite = new TestSuite(WordTest.class); 051 return suite; 052 } 053 054 055 //private final static int bitlen = 100; 056 057 Word a; 058 059 060 Word b; 061 062 063 Word c; 064 065 066 Word d; 067 068 069 @Override 070 protected void setUp() { 071 a = b = c = d = null; 072 } 073 074 075 @Override 076 protected void tearDown() { 077 a = b = c = d = null; 078 } 079 080 081 /** 082 * Test constructor and toString. 083 */ 084 public void testConstructor() { 085 WordFactory wf = new WordFactory("abcdefg"); 086 a = new Word(wf); 087 b = a; 088 //System.out.println("a = " + a); 089 assertEquals("() = ()", a, b); 090 assertEquals("length( () ) = 0", a.length(), 0); 091 assertTrue("isONE( () )", a.isONE()); 092 assertTrue("isUnit( () )", a.isUnit()); 093 094 b = new Word(wf, "abc"); 095 c = wf.parse(" a b c "); 096 //System.out.println("b = " + b); 097 //System.out.println("c = " + c); 098 assertEquals("b = c: ", b, c); 099 100 assertFalse("isONE( () )", b.isONE()); 101 assertFalse("isUnit( () )", b.isUnit()); 102 assertFalse("isONE( () )", c.isONE()); 103 assertFalse("isUnit( () )", c.isUnit()); 104 105 String s = b.toString(); 106 String t = c.toString(); 107 //System.out.println("s = " + s); 108 //System.out.println("t = " + t); 109 assertEquals("s = t: ", s, t); 110 } 111 112 113 /** 114 * Test word factory. 115 */ 116 public void testFactory() { 117 WordFactory wf = new WordFactory("abcdefg"); 118 //System.out.println("wf = " + wf); 119 Word w = wf.getONE(); 120 //System.out.println("w = " + w); 121 assertTrue("w == (): ", w.isONE()); 122 123 w = wf.parse("aaabbbcccaaa"); 124 //System.out.println("w = " + w); 125 assertFalse("w != (): ", w.isONE()); 126 127 a = wf.parse(w.toString()); 128 //System.out.println("a = " + a); 129 assertEquals("w = a", a, w); 130 131 WordFactory wf2 = new WordFactory(w.toString()); 132 //System.out.println("wf2 = " + wf2); 133 134 a = wf2.parse(w.toString()); 135 //System.out.println("a = " + a); 136 assertEquals("w = a", a, w); 137 138 List<Word> gens = wf.generators(); 139 //System.out.println("gens = " + gens); 140 assertTrue("#gens == 7: ", gens.size() == 7); 141 for (Word v : gens) { 142 a = wf.parse(v.toString()); 143 assertEquals("a == v", a, v); 144 } 145 } 146 147 148 /** 149 * Test random word. 150 */ 151 public void testRandom() { 152 WordFactory wf = new WordFactory("uvw"); 153 //System.out.println("wf = " + wf); 154 155 a = wf.random(5); 156 b = wf.random(6); 157 c = wf.random(7); 158 //System.out.println("a = " + a); 159 //System.out.println("b = " + b); 160 //System.out.println("c = " + c); 161 162 assertFalse("a != (): ", a.isONE()); 163 assertFalse("b != (): ", b.isONE()); 164 assertFalse("c != (): ", c.isONE()); 165 assertTrue("#a == 5", a.length() == 5); 166 assertTrue("#b == 6", b.length() == 6); 167 assertTrue("#c == 7", c.length() == 7); 168 169 SortedMap<String, Integer> ma = a.dependencyOnVariables(); 170 SortedMap<String, Integer> mb = b.dependencyOnVariables(); 171 SortedMap<String, Integer> mc = c.dependencyOnVariables(); 172 //System.out.println("ma = " + ma); 173 //System.out.println("mb = " + mb); 174 //System.out.println("mc = " + mc); 175 assertTrue("#ma <= 3", ma.size() <= wf.length()); 176 assertTrue("#mb <= 3", mb.size() <= wf.length()); 177 assertTrue("#mc <= 3", mc.size() <= wf.length()); 178 assertTrue("S ma <= #a", sum(ma.values()) == a.length()); 179 assertTrue("S mb <= #b", sum(mb.values()) == b.length()); 180 assertTrue("S mc <= #c", sum(mc.values()) == c.length()); 181 } 182 183 184 int sum(Collection<Integer> li) { 185 int s = 0; 186 for (Integer i : li) { 187 s += i; 188 } 189 return s; 190 } 191 192 193 /** 194 * Test multiplication. 195 */ 196 public void testMultiplication() { 197 WordFactory wf = new WordFactory("abcdefgx"); 198 a = new Word(wf, "abc"); 199 b = new Word(wf, "cddaa"); 200 //System.out.println("a = " + a); 201 //System.out.println("b = " + b); 202 203 c = a.multiply(b); 204 //System.out.println("c = " + c); 205 206 assertTrue("divides: ", a.divides(c)); 207 assertTrue("divides: ", b.divides(c)); 208 assertTrue("multiple: ", c.multipleOf(a)); 209 assertTrue("multiple: ", c.multipleOf(b)); 210 211 d = c.divide(a); 212 //System.out.println("d = " + d); 213 assertEquals("d = b", d, b); 214 215 d = c.divide(b); 216 //System.out.println("d = " + d); 217 assertEquals("d = a", d, a); 218 219 d = c.divide(c); 220 //System.out.println("d = " + d); 221 assertTrue("isONE( () )", d.isONE()); 222 223 d = new Word(wf, "xx"); 224 c = a.multiply(d).multiply(b); 225 //System.out.println("d = " + d); 226 //System.out.println("c = " + c); 227 228 assertTrue("divides: ", d.divides(c)); 229 Word[] ret = c.divideWord(d); 230 //System.out.println("ret = " + ret[0] + ", " + ret[1]); 231 232 assertEquals("prefix(c/d) = a", a, ret[0]); 233 assertEquals("suffix(c/d) = b", b, ret[1]); 234 235 Word e = ret[0].multiply(d).multiply(ret[1]); 236 assertEquals("prefix(c/d) d suffix(c/d) = e", e, c); 237 } 238 239 240 /** 241 * Test overlap. 242 */ 243 public void testOverlap() { 244 WordFactory wf = new WordFactory("abcdefg"); 245 a = new Word(wf, "abc"); 246 b = new Word(wf, "ddabca"); 247 //System.out.println("a = " + a); 248 //System.out.println("b = " + b); 249 250 OverlapList ol = a.overlap(b); 251 //System.out.println("ol = " + ol); 252 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 253 254 ol = b.overlap(a); 255 //System.out.println("ol = " + ol); 256 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 257 258 a = new Word(wf, "abcfff"); 259 b = new Word(wf, "ddabc"); 260 //System.out.println("a = " + a); 261 //System.out.println("b = " + b); 262 263 ol = a.overlap(b); 264 //System.out.println("ol = " + ol); 265 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 266 267 ol = b.overlap(a); 268 //System.out.println("ol = " + ol); 269 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 270 271 a = new Word(wf, "fffabc"); 272 b = new Word(wf, "abcdd"); 273 //System.out.println("a = " + a); 274 //System.out.println("b = " + b); 275 276 ol = a.overlap(b); 277 //System.out.println("ol = " + ol); 278 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 279 280 ol = b.overlap(a); 281 //System.out.println("ol = " + ol); 282 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 283 284 a = new Word(wf, "ab"); 285 b = new Word(wf, "dabeabfabc"); 286 //System.out.println("a = " + a); 287 //System.out.println("b = " + b); 288 ol = a.overlap(b); 289 //System.out.println("ol = " + ol); 290 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 291 ol = b.overlap(a); 292 //System.out.println("ol = " + ol); 293 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 294 295 a = new Word(wf, "abc"); 296 b = new Word(wf, "abceabcfabc"); 297 //System.out.println("a = " + a); 298 //System.out.println("b = " + b); 299 ol = a.overlap(b); 300 //System.out.println("ol = " + ol); 301 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 302 ol = b.overlap(a); 303 //System.out.println("ol = " + ol); 304 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 305 306 a = new Word(wf, "aa"); 307 b = new Word(wf, "aaaaaaaaa"); 308 //System.out.println("a = " + a); 309 //System.out.println("b = " + b); 310 ol = a.overlap(b); 311 //System.out.println("ol = " + ol); 312 assertTrue("isOverlap: ", ol.isOverlap(a,b)); 313 ol = b.overlap(a); 314 //System.out.println("ol = " + ol); 315 assertTrue("isOverlap: ", ol.isOverlap(b,a)); 316 } 317 318 319 /** 320 * Test valueOf. 321 */ 322 public void testValueOf() { 323 String[] vars = new String[] { "a", "b", "c", "d" }; 324 WordFactory wf = new WordFactory(vars); 325 326 ExpVector ef = ExpVector.random(4,5L,0.5f); 327 //System.out.println("ef = " + ef); 328 329 a = wf.valueOf(ef); 330 //System.out.println("a = " + a); 331 assertTrue("deg(ef) == deg(a): " + ef + ", " + a, ef.degree() == a.degree() ); 332 333 String es = ef.toString(vars); 334 //System.out.println("es = " + es); 335 assertTrue("ef != ''" + ef, es.length() >= 0 ); 336 } 337 338 339 /** 340 * Test constructor with multi-letter Strings. 341 */ 342 public void testMultiLetters() { 343 String[] vars = new String[] {"a1", "b", " e23", "tt*", "x y" }; 344 WordFactory wf = new WordFactory(vars); 345 //System.out.println("wf = " + wf); 346 String s = wf.toString(); 347 assertEquals("w == vars: ", s, "\"a1,b,e23,tt,xy\""); 348 349 Word w = wf.parse("a1 a1 b*b*b tt xy e23 tt xy"); 350 s = w.toString(); 351 String t = "\"a1 a1 b b b tt xy e23 tt xy\""; 352 //System.out.println("s = " + s); 353 //System.out.println("t = " + t); 354 assertEquals("w == parse: ", s, t); 355 356 Word u = wf.parse("xy e23 tt xy a1 a1 b*b*b tt"); 357 s = u.toString(); 358 String t1 = "\"xy e23 tt xy a1 a1 b b b tt\""; 359 //System.out.println("s = " + s); 360 //System.out.println("t = " + t1); 361 assertEquals("w == parse: ", s, t1); 362 363 Word v = u.multiply(w); 364 s = v.toString(); 365 String t2 = t1.substring(0,t1.length()-1) + " " + t.substring(1); 366 //System.out.println("s = " + s); 367 //System.out.println("t = " + t2); 368 assertEquals("w == parse: ", s, t2); 369 370 v = w.multiply(u); 371 s = v.toString(); 372 t2 = t.substring(0,t.length()-1) + " " + t1.substring(1); 373 //System.out.println("s = " + s); 374 //System.out.println("t = " + t2); 375 assertEquals("w == parse: ", s, t2); 376 377 w = wf.random(5); 378 //System.out.println("w = " + w); 379 u = wf.random(5); 380 //System.out.println("u = " + u); 381 v = u.multiply(w); 382 //System.out.println("v = " + v); 383 assertTrue("#v = #w+#u: ", v.length() == w.length()+u.length()); 384 385 List<Word> gens = wf.generators(); 386 //System.out.println("gens = " + gens); 387 assertTrue("#gens == 5: ", gens.size() == 5); 388 for (Word x : gens) { 389 a = wf.parse(x.toString()); 390 assertEquals("a == x", a, x); 391 } 392 } 393 394}