17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2002-2012, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.util;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Random;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.util.BNF;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.util.Pick;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.util.Quoter;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.util.Tokenizer;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeSet;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TestBNF {
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final String[] testRules = {
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]{3};",
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]{3,};",
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]{3,5};",
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]*;",
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]?;",
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [ab]+;",
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$us = [a-z];" +
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [0-9$us];",
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = a $foo b? 25% end 30% | $foo 50%;\r\n" +
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$foo = c{1,5} 20%;",
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [a-z]{1,5}~;",
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = [a-z]{5}~;",
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$root = '\\' (u | U0010 | U000 $hex) $hex{4} ;\r\n" +
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$hex = [0-9A-Fa-f];",
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static String unicodeSetBNF = "" +
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$root = $leaf | '[' $s $root2 $s ']' ;\r\n" +
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$root2 = $leaf | '[' $s $root3 $s ']' | ($root3 $s ($op $root3 $s){0,3}) ;\r\n" +
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$root3 = $leaf | '[' $s $root4 $s ']' | ($root4 $s ($op $root4 $s){0,3}) ;\r\n" +
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$root4 = $leaf | ($leaf $s ($op $leaf $s){0,3}) ;\r\n" +
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$op = (('&' | '-') $s)? 70%;" +
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$leaf = '[' $s $list $s ']' | $prop;\r\n" +
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$list = ($char $s ('-' $s $char $s)? 30%){1,5} ;\r\n" +
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$prop = '\\' (p | P) '{' $s $propName $s '}' | '[:' '^'? $s $propName $s ':]';\r\n" +
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$needsQuote = [\\-\\][:whitespace:][:control:]] ;\r\n" +
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$char = [[\\u0000-\\U00010FFFF]-$needsQuote] | $quoted ;\r\n" +
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$quoted = '\\' ('u' | 'U0010' | 'U000' $hex) $hex{4} ;\r\n" +
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$hex = [0-9A-Fa-f];\r\n" +
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$s = ' '? 20%;\r\n" +
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$propName = (whitespace | ws) | (uppercase | uc) | (lowercase | lc) | $category;\r\n" +
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$category = ((general | gc) $s '=' $s)? $catvalue;\r\n" +
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    "$catvalue = (C | Other | Cc | Control | Cf | Format | Cn | Unassigned | L | Letter);\r\n";
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main (String[] args) {
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testTokenizer();
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < testRules.length; ++i) {
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            testBNF(testRules[i], null, 20);
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testBNF(unicodeSetBNF, null, 20);
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //testParser();
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void testBNF(String rules, UnicodeSet chars, int count) {
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BNF bnf = new BNF(new Random(0), new Quoter.RuleQuoter())
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        .addSet("$chars", chars)
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        .addRules(rules)
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        .complete();
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("====================================");
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("BNF");
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println(rules);
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println(bnf.getInternal());
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < count; ++i) {
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(i + ": " + bnf.next());
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static testManual() {
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick p = Pick.maybe(75,Pick.unquoted("a"));
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testOr(p, 1);
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.or(new String[]{"", "a", "bb", "ccc"});
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testOr(p, 3);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.repeat(3, 5, new int[]{20, 30, 20}, "a");
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testOr(p, 5);
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.codePoint("[a-ce]");
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testCodePoints(p);
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.codePoint("[a-ce]");
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testCodePoints(p);
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.string(2, 8, p);
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testOr(p,10);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.or(new String[]{"", "a", "bb", "ccc"});
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = Pick.and(p).and2(p).and2("&");
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testMatch(p, "abb&");
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testMatch(p, "bba");
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // testEnglish();
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void testMatch(Pick p, String source) {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick.Position pp = new Pick.Position();
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean value = p.match(source, pp);
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("Match: " + value + ", " + pp);
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void testParser() {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Pick.Target target = new Pick.Target();
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < rules.length; ++i) {
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                target.addRule(rules[i]);
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // TODO Auto-generated catch block
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static class Counts {
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] counts;
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Counts(int max) {
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            counts = new int[max+1];
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        void inc(int index) {
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            counts[index]++;
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        void show() {
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println("Printing Counts");
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < counts.length; ++i) {
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (counts[i] == 0) continue;
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(i + ": " + counts[i]);
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println();
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*    static final String[] rules = {
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$s = ' ';",
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$noun = dog | house | government | wall | street | zebra;",
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$adjective = red | glorious | simple | nasty | heavy | clean;",
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$article = quickly | oddly | silently | boldly;",
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$adjectivePhrase = ($adverb $s)? 50% $adjective* 0% 30% 20% 10%;",
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$nounPhrase = $articles $s ($adjectivePhrase $s)? 30% $noun;",
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$verb = goes | fishes | walks | sleeps;",
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$tverb = carries | lifts | overturns | hits | jumps on;",
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$copula = is 30% | seems 10%;",
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$sentence1 = $nounPhrase $s $verb $s ($s $adverb)? 30%;",
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$sentence2 = $nounPhrase $s $tverb $s $nounPhrase ($s $adverb)? 30%;",
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$sentence3 = $nounPhrase $s $copula $s $adjectivePhrase;",
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$conj = but | and | or;",
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$sentence4 = $sentence1 | $sentence2 | $sentence3 20% | $sentence4 $conj $sentence4 20%;",
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "$sentence = $sentence4 '.';"};
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void testEnglish() {
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick s = Pick.unquoted(" ");
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick verbs = Pick.or(new String[]{"goes", "fishes", "walks", "sleeps"});
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick transitive = Pick.or(new String[]{"carries", "lifts", "overturns", "hits", "jumps on"});
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick nouns = Pick.or(new String[]{"dog", "house", "government", "wall", "street", "zebra"});
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick adjectives = Pick.or(new String[]{"red", "glorious", "simple", "nasty", "heavy", "clean"});
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick articles = Pick.or(new String[]{"the", "a"});
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick adverbs = Pick.or(new String[]{"quickly", "oddly", "silently", "boldly"});
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick adjectivePhrase = Pick.and(0.5, Pick.and(adverbs).and2(s)).and2(adjectives);
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick nounPhrase = Pick.and(articles).and2(s)
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            .and2(0.3, Pick.and(adjectivePhrase).and2(s))
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            .and2(nouns);
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick copula = Pick.or(new String[]{"is", "seems"});
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick sentence1 = Pick.and(nounPhrase).and2(s).and2(verbs)
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            .and2(0.3, Pick.and(s).and2(adverbs)).name("s1");
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick sentence2 = Pick.and(nounPhrase).and2(s).and2(transitive).and2(s).and2(nounPhrase)
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            .and2(0.3, Pick.and(s).and2(adverbs)).name("s2");
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick sentence3 = Pick.and(nounPhrase).and2(s).and2(copula).and2(s).and2(adjectivePhrase).name("s3");
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick conj = Pick.or(new String[]{", but", ", and", ", or"});
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick forward = Pick.unquoted("forward");
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick pair = Pick.and(forward).and2(conj).and2(s).and2(forward).name("part");
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick sentenceBase = Pick.or(sentence1).or2(sentence2).or2(sentence3).or2(0.6666, pair).name("sentence");
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sentenceBase.replace(forward, sentenceBase);
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick sentence = Pick.and(sentenceBase).and2(Pick.unquoted("."));
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick.Target target = Pick.Target.make(sentence);
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 50; ++i) {
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(i + ": " + target.next());
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void testOr(Pick p, int count) {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick.Target target = Pick.Target.make(p);
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Counts counts = new Counts(count + 10);
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 1000; ++i) {
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = target.next();
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            counts.inc(s.length());
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        counts.show();
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void testCodePoints(Pick p) {
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Pick.Target target = Pick.Target.make(p);
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Counts counts = new Counts(128);
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 10000; ++i) {
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String s = target.next();
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            counts.inc(s.charAt(0));
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        counts.show();
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void printRandoms() {
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BNF bnf = new BNF(new Random(0), new Quoter.RuleQuoter())
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        .addRules("[a-z]{2,5}").complete();
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("Start");
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 100; ++i) {
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String temp = bnf.next();
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(i + ")\t" + temp);
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void testTokenizer() {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Tokenizer t = new Tokenizer();
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] samples = {"a'b'c d #abc\r e", "'a '123 321",
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\\\\", "a'b", "a'", "abc def%?ghi", "%", "a", "\\ a", "a''''b"};
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < samples.length; ++i) {
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            t.setSource(samples[i]);
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println();
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println("Input: " + t.getSource());
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int type = 0;
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (type != Tokenizer.DONE) {
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                type = t.next();
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(t.toString(type, false));
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
245