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}