17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2000-2014, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v2.1 : collate/StringSearchTest
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/srchtest.cpp
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.search;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.Collator.IDENTICAL;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.Collator.PRIMARY;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.Collator.QUATERNARY;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.Collator.SECONDARY;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.Collator.TERTIARY;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.SearchIterator.ElementComparisonType.ANY_BASE_WEIGHT_IS_WILDCARD;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.SearchIterator.ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport static com.ibm.icu.text.SearchIterator.ElementComparisonType.STANDARD_ELEMENT_COMPARISON;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.StringCharacterIterator;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.BreakIterator;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Collator;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.RuleBasedCollator;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SearchIterator;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SearchIterator.ElementComparisonType;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.StringSearch;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class SearchTest extends TestFmwk {
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //inner class
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static class SearchData {
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SearchData(String text, String pattern,
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String coll, int strength, ElementComparisonType cmpType, String breaker,
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    int[] offset, int[] size) {
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.text = text;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.pattern = pattern;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.collator = coll;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.strength = strength;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.cmpType = cmpType;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.breaker = breaker;
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.offset = offset;
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.size = size;
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String              text;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String              pattern;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String              collator;
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int                 strength;
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ElementComparisonType   cmpType;
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String              breaker;
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[]               offset;
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[]               size;
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RuleBasedCollator m_en_us_;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RuleBasedCollator m_fr_fr_;
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RuleBasedCollator m_de_;
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RuleBasedCollator m_es_;
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    BreakIterator     m_en_wordbreaker_;
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    BreakIterator     m_en_characterbreaker_;
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Just calling SearchData constructor, to make the test data source code
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // nice and short
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static SearchData SD(String text, String pattern, String coll, int strength,
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ElementComparisonType cmpType, String breaker, int[] offset, int[] size) {
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new SearchData(text, pattern, coll, strength, cmpType, breaker, offset, size);
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Just returning int[], to make the test data nice and short
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static int[] IA(int... elements) {
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return elements;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static SearchData[] BASIC = {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("xxxxxxxxxxxxxxxxxxxx", "fisher", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, -1), IA(6)),
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly spring string string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, 20, -1), IA(6, 6)),
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(6, 20, -1), IA(6, 6)),
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 14, -1), IA(6, 6)),
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Scott Ganyo", "c", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Scott Ganyo", " ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(5, -1), IA(1)),
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300b", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00c9", "e", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData BREAKITERATOREXACT[] = {
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, 5, -1), IA(3, 3)),
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(5, -1), IA(3)),
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(10, 14, -1), IA(3, 2)),
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(10, -1), IA(3)),
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Channel, another channel, more channels, and one last Channel", "Channel", "es", TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(0, 54, -1), IA(7, 7)),
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* jitterbug 1745 */
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("testing that \u00e9 does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 17, 30, -1), IA(1, 1, 1)),
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("testing that string ab\u00e9cd does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 28, 41, -1), IA(1, 1, 1)),
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00c9", "e", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, -1), IA(1)),
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData BREAKITERATORCANONICAL[] = {
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, 5, -1), IA(3, 3)),
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(5, -1), IA(3)),
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(10, 14, -1), IA(3, 2)),
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(10, -1), IA(3)),
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Channel, another channel, more channels, and one last Channel", "Channel", "es", TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(0, 54, -1), IA(7, 7)),
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* jitterbug 1745 */
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("testing that \u00e9 does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 17, 30, -1), IA(1, 1, 1)),
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("testing that string ab\u00e9cd does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 28, 41, -1), IA(1, 1, 1)),
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00c9", "e", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, -1), IA(1)),
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData BASICCANONICAL[] = {
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("xxxxxxxxxxxxxxxxxxxx", "fisher", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, -1), IA(6)),
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly spring string string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, 20, -1), IA(6, 6)),
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("silly string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(6, 20, -1), IA(6, 6)),
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 14, -1), IA(6, 6)),
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Scott Ganyo", "c", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("Scott Ganyo", " ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(5, -1), IA(1)),
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300b", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325b", "\u0300b", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0325\u0300A\u0325\u0300", "\u0300A\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0325\u0300A\u0325\u0300", "\u0325A\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325b\u0300\u0325c \u0325b\u0300 \u0300b\u0325", "\u0300b\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00c4\u0323", "A\u0323\u0308", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0308\u0323", "\u0323\u0308", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData COLLATOR[] = {
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* english */
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("fox fpx", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* tailored */
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("fox fpx", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(3, 3)),
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String TESTCOLLATORRULE = "& o,O ; p,P";
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String EXTRACOLLATIONRULE = " & ae ; \u00e4 & AE ; \u00c4 & oe ; \u00f6 & OE ; \u00d6 & ue ; \u00fc & UE ; \u00dc";
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData COLLATORCANONICAL[] = {
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* english */
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("fox fpx", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* tailored */
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("fox fpx", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(3, 3)),
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData COMPOSITEBOUNDARIES[] = {
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u00C0C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0A", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("B\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0B", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* first one matches only because it's at the start of the text */
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* \\u0300 blocked by \\u0300 */
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0\u0300", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* A + 030A + 0301 */
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u01FA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030AA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* blocked accent */
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FAA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F73", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F71\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0F73", "A\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73A", "\u0F72A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA A\u0301\u030A A\u030A\u0301 A\u030A \u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, -1), IA(2)),
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData COMPOSITEBOUNDARIESCANONICAL[] = {
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u00C0C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0A", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("B\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0B", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* first one matches only because it's at the start of the text */
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* \u0300 blocked by \u0300 */
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00C0\u0300", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* A + 030A + 0301 */
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u01FA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030AA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* blocked accent */
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA", "\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FAA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F73", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73", "\u0F71\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0F73", "A\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0F73A", "\u0F72A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u01FA A\u0301\u030A A\u030A\u0301 A\u030A \u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, -1), IA(2)),
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData SUPPLEMENTARY[] = {
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abc \uD800\uDC00 \uD800\uDC01 \uD801\uDC00 \uD800\uDC00abc abc\uD800\uDC00 \uD800\uD800\uDC00 \uD800\uDC00\uDC00",
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\uD800\uDC00", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 13, 22, 26, 29, -1), IA(2, 2, 2, 2, 2)),
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and\uD834\uDDB9this sentence", "\uD834\uDDB9", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(2)),
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and \uD834\uDDB9 this sentence", " \uD834\uDDB9 ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and-\uD834\uDDB9-this sentence", "-\uD834\uDDB9-", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and,\uD834\uDDB9,this sentence", ",\uD834\uDDB9,", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and?\uD834\uDDB9?this sentence", "?\uD834\uDDB9?", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String CONTRACTIONRULE = "&z = ab/c < AB < X\u0300 < ABC < X\u0300\u0315";
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData CONTRACTION[] = {
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* common discontiguous */
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0300\u0315", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0300\u0315", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* contraction prefix */
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "AB", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * discontiguous problem here for backwards iteration. accents not found because discontiguous stores all
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * information
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0300\u0319\u0315", "\u0319", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* ends not with a contraction character */
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0315\u0300D", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0315\u0300D", "X\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0300\u031A\u0315D", "X\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* blocked discontiguous */
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0300\u031A\u0315D", "\u031A\u0315D", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * "ab" generates a contraction that's an expansion. The "z" matches the first CE of the expansion but the
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * match fails because it ends in the middle of an expansion...
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("ab", "z", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData CONTRACTIONCANONICAL[] = {
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* common discontiguous */
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0300\u0315", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A\u0300\u0315", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* contraction prefix */
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "AB", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("AB\u0315C", "\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * discontiguous problem here for backwards iteration. forwards gives 0, 4 but backwards give 1, 3
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * {"X\u0300\u0319\u0315", "\u0319", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, {0, -1), {4}),
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* ends not with a contraction character */
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0315\u0300D", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0315\u0300D", "X\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0300\u031A\u0315D", "X\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* blocked discontiguous */
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("X\u0300\u031A\u0315D", "\u031A\u0315D", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * "ab" generates a contraction that's an expansion. The "z" matches the first CE of the expansion but the
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * match fails because it ends in the middle of an expansion...
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("ab", "z", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(2)),
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData MATCH[] = {
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a busy bee is a very busy beeee", "bee", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(7, 26, -1), IA(3, 3)),
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890 */
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a busy bee is a very busy beeee with no bee life", "bee", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(7, 26, 40, -1), IA(3, 3, 3)),
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String IGNORABLERULE = "&a = \u0300";
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData IGNORABLE[] = {
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This isn't much of a test when matches have to be on grapheme boundiaries. The match at 0 only works because it's
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * at the start of the text.
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u0315 \u0300\u0315 ", "\u0300", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData DIACTRICMATCH[] = {
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0061\u0061\u00E1", "\u0061\u00E1", null, SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(2)),
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0020\u00C2\u0303\u0020\u0041\u0061\u1EAA\u0041\u0302\u0303\u00C2\u0303\u1EAB\u0061\u0302\u0303\u00E2\u0303\uD806\uDC01\u0300\u0020", "\u00C2\u0303",
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, 4, 5, 6, 7, 10, 12, 13, 16, -1), IA(2, 1, 1, 1, 3, 2, 1, 3, 2)),
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u03BA\u03B1\u03B9\u0300\u0020\u03BA\u03B1\u1F76", "\u03BA\u03B1\u03B9", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 5, -1), IA(4, 3)),
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData NORMCANONICAL[] = {
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u0300\u0325", "\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData NORMEXACT[] = {
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "a\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData NONNORMEXACT[] = {
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("a\u0300\u0325", "\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData OVERLAP[] = {
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 2, 4, -1), IA(4, 4, 4)),
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData NONOVERLAP[] = {
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(4, 4)),
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData OVERLAPCANONICAL[] = {
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 2, 4, -1), IA(4, 4, 4)),
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData NONOVERLAPCANONICAL[] = {
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(4, 4)),
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData PATTERNCANONICAL[] = {
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "the", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 31, -1), IA(3, 3)),
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData PATTERN[] = {
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "the", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 31, -1), IA(3, 3)),
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String PECHE_WITH_ACCENTS = "un p\u00E9ch\u00E9, "
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "\u00E7a p\u00E8che par, "
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "p\u00E9cher, "
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "une p\u00EAche, "
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "un p\u00EAcher, "
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "j\u2019ai p\u00EAch\u00E9, "
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "un p\u00E9cheur, "
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "\u201Cp\u00E9che\u201D, "
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "decomp peche\u0301, "
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                + "base peche";
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // in the above, the interesting words and their offsets are:
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    3 pe<301>che<301>
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    13 pe<300>che
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    24 pe<301>cher
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    36 pe<302>che
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    46 pe<302>cher
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    59 pe<302>che<301>
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    69 pe<301>cheur
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    79 pe<301>che
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    94 peche<+301>
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //    107 peche
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData STRENGTH[] = {
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890123456789 */
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(16, -1), IA(3)),
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("blackbirds Pat p\u00E9ch\u00E9 p\u00EAche p\u00E9cher p\u00EAcher Tod T\u00F6ne black Tofu blackbirds Ton PAT toehold blackbird black-bird pat toe big Toe",
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(15, 21, 27, 34, -1), IA(5, 5, 5, 5)),
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, 14, -1), IA(3, 2)),
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A channel, another CHANNEL, more Channels, and one last channel...", "channel", "es", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(2, 19, 33, 56, -1), IA(7, 7, 7, 7)),
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("\u00c0 should match but not A", "A\u0300", "en", IDENTICAL, STANDARD_ELEMENT_COMPARISON,  null, IA(0, -1), IA(1, 0)),
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* some tests for modified element comparison, ticket #7093 */
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(107, -1), IA(5)),
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(24, 69, 79, -1), IA(5, 5, 5)),
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(79, -1), IA(5)),
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 24, 69, 79, -1), IA(5, 5, 5, 5)),
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, -1), IA(5, 5)),
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 24, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 6, 5)),
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, 94, 107, -1), IA(5, 5, 6, 5)),
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* more tests for modified element comparison (with fr), ticket #7093 */
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(107, -1), IA(5)),
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(24, 69, 79, -1), IA(5, 5, 5)),
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(79, -1), IA(5)),
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 24, 69, 79, -1), IA(5, 5, 5, 5)),
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, -1), IA(5, 5)),
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 24, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 6, 5)),
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, 94, 107, -1), IA(5, 5, 6, 5)),
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 13, 24, 36, 46, 59, 69, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 5, 5, 5, 6, 5)),
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, ANY_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 13, 36, 59, 79, 94, 107, -1), IA(5, 5, 5, 5, 5, 6, 5)),
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData STRENGTHCANONICAL[] = {
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890123456789 */
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(16, -1), IA(3)),
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("blackbirds Pat p\u00E9ch\u00E9 p\u00EAche p\u00E9cher p\u00EAcher Tod T\u00F6ne black Tofu blackbirds Ton PAT toehold blackbird black-bird pat toe big Toe",
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(15, 21, 27, 34, -1), IA(5, 5, 5, 5)),
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, 14, -1), IA(3, 2)),
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("A channel, another CHANNEL, more Channels, and one last channel...", "channel", "es", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(2, 19, 33, 56, -1), IA(7, 7, 7, 7)),
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    SearchData SUPPLEMENTARYCANONICAL[] = {
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890012345678901234567890123456789012345678901234567890012345678901234567890123456789 */
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abc \uD800\uDC00 \uD800\uDC01 \uD801\uDC00 \uD800\uDC00abc abc\uD800\uDC00 \uD800\uD800\uDC00 \uD800\uDC00\uDC00", "\uD800\uDC00",
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 13, 22, 26, 29, -1), IA(2, 2, 2, 2, 2)),
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and\uD834\uDDB9this sentence", "\uD834\uDDB9", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(2)),
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and \uD834\uDDB9 this sentence", " \uD834\uDDB9 ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and-\uD834\uDDB9-this sentence", "-\uD834\uDDB9-", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and,\uD834\uDDB9,this sentence", ",\uD834\uDDB9,", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("and?\uD834\uDDB9?this sentence", "?\uD834\uDDB9?", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static SearchData VARIABLE[] = {
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890123456789 */
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("blackbirds black blackbirds blackbird black-bird", "blackbird", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 17, 28, 38, -1), IA(9, 9, 9, 10)),
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * to see that it doesn't go into an infinite loop if the start of text is a ignorable character
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(" on", "go", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("abcdefghijklmnopqrstuvwxyz", "   ",
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null,
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            IA(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1),
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            IA(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)),
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* testing tightest match */
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(" abc  a bc   ab c    a  bc     ab  c", "abc", null, QUATERNARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(3)),
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  012345678901234567890123456789012345678901234567890123456789 */
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD(" abc  a bc   ab c    a  bc     ab  c", "abc", null, SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, 6, 13, 21, 31, -1), IA(3, 4, 4, 5, 5)),
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* totally ignorable text */
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("           ---------------", "abc", null, SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static SearchData TEXTCANONICAL[] = {
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("the foxy brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 15, -1), IA(3, 3)),
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SD("the quick brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, -1), IA(3)),
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructor
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public SearchTest()
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected void init()throws Exception{
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_ = (RuleBasedCollator)Collator.getInstance(Locale.US);
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_fr_fr_ = (RuleBasedCollator)Collator.getInstance(Locale.FRANCE);
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_de_ = (RuleBasedCollator)Collator.getInstance(new Locale("de", "DE"));
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_es_ = (RuleBasedCollator)Collator.getInstance(new Locale("es", "ES"));
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_wordbreaker_ = BreakIterator.getWordInstance();
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_characterbreaker_ = BreakIterator.getCharacterInstance();
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = m_de_.getRules() + EXTRACOLLATIONRULE;
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_de_ = new RuleBasedCollator(rules);
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        rules = m_es_.getRules() + EXTRACOLLATIONRULE;
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_es_ = new RuleBasedCollator(rules);
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new SearchTest().run(args);
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // new SearchTest().TestContraction();
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RuleBasedCollator getCollator(String collator) {
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (collator == null) {
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_en_us_;
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } if (collator.equals("fr")) {
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_fr_fr_;
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else if (collator.equals("de")) {
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_de_;
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else if (collator.equals("es")) {
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_es_;
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_en_us_;
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    BreakIterator getBreakIterator(String breaker) {
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (breaker == null) {
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } if (breaker.equals("wordbreaker")) {
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_en_wordbreaker_;
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return m_en_characterbreaker_;
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    boolean assertCanonicalEqual(SearchData search) {
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collator      collator = getCollator(search.collator);
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator breaker  = getBreakIterator(search.breaker);
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch;
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = search.text;
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = search.pattern;
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (breaker != null) {
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker.setText(text);
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(search.strength);
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setElementComparisonType(search.cmpType);
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search" + e.getMessage());
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, search)) {
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(TERTIARY);
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setDecomposition(Collator.NO_DECOMPOSITION);
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(TERTIARY);
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setDecomposition(Collator.NO_DECOMPOSITION);
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return true;
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    boolean assertEqual(SearchData search) {
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collator      collator = getCollator(search.collator);
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator breaker  = getBreakIterator(search.breaker);
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch;
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = search.text;
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = search.pattern;
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (breaker != null) {
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker.setText(text);
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(search.strength);
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setElementComparisonType(search.cmpType);
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search " + e.getMessage());
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, search)) {
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(TERTIARY);
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(TERTIARY);
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return true;
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    boolean assertEqualWithAttribute(SearchData search, boolean canonical, boolean overlap) {
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collator      collator = getCollator(search.collator);
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator breaker  = getBreakIterator(search.breaker);
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch;
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = search.text;
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = search.pattern;
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (breaker != null) {
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker.setText(text);
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(search.strength);
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(canonical);
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setOverlapping(overlap);
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setElementComparisonType(search.cmpType);
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search " + e.getMessage());
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, search)) {
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(TERTIARY);
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        collator.setStrength(TERTIARY);
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return true;
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    boolean assertEqualWithStringSearch(StringSearch strsrch, SearchData search) {
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int           count       = 0;
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int   matchindex  = search.offset[count];
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String matchtext;
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getMatchStart() != SearchIterator.DONE ||
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getMatchLength() != 0) {
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error with the initialization of match start and length");
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // start of following matches
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (matchindex >= 0) {
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int matchlength = search.size[count];
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.next();
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //int x = strsrch.getMatchStart();
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchindex != strsrch.getMatchStart() ||
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                matchlength != strsrch.getMatchLength()) {
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + search.text);
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Searching forward for pattern: " + strsrch.getPattern());
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Expected offset,len " + matchindex + ", " + matchlength + "; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return false;
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            count ++;
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchtext = strsrch.getMatchedText();
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String targetText = search.text;
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchlength > 0 &&
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                targetText.substring(matchindex, matchindex + matchlength).compareTo(matchtext) != 0) {
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting following matched text");
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchindex = search.offset[count];
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.next();
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getMatchStart() != SearchIterator.DONE ||
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getMatchLength() != 0) {
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + search.text);
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Searching forward for pattern: " + strsrch.getPattern());
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Expected DONE offset,len -1, 0; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return false;
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // start of preceding matches
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        count = count == 0 ? 0 : count - 1;
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        matchindex = search.offset[count];
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (matchindex >= 0) {
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int matchlength = search.size[count];
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.previous();
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchindex != strsrch.getMatchStart() ||
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                matchlength != strsrch.getMatchLength()) {
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + search.text);
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Searching backward for pattern: " + strsrch.getPattern());
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Expected offset,len " + matchindex + ", " + matchlength + "; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return false;
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchtext = strsrch.getMatchedText();
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String targetText = search.text;
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchlength > 0 &&
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                targetText.substring(matchindex, matchindex + matchlength).compareTo(matchtext) != 0) {
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting following matched text");
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchindex = count > 0 ? search.offset[count - 1] : -1;
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            count --;
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.previous();
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getMatchStart() != SearchIterator.DONE ||
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getMatchLength() != 0) {
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + search.text);
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Searching backward for pattern: " + strsrch.getPattern());
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Expected DONE offset,len -1, 0; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return false;
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return true;
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestConstructor()
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "pattern";
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "text";
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringCharacterIterator textiter = new StringCharacterIterator(text);
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collator defaultcollator = Collator.getInstance();
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator breaker = BreakIterator.getCharacterInstance();
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        breaker.setText(text);
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch search = new StringSearch(pattern, text);
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!search.getPattern().equals(pattern)
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getTarget().equals(textiter)
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getCollator().equals(defaultcollator)
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*|| !search.getBreakIterator().equals(breaker)*/) {
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringSearch(String, String) error");
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        search = new StringSearch(pattern, textiter, m_fr_fr_);
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!search.getPattern().equals(pattern)
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getTarget().equals(textiter)
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getCollator().equals(m_fr_fr_)
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*|| !search.getBreakIterator().equals(breaker)*/) {
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringSearch(String, StringCharacterIterator, "
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + "RuleBasedCollator) error");
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale de = new Locale("de", "DE");
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        breaker = BreakIterator.getCharacterInstance(de);
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        breaker.setText(text);
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        search = new StringSearch(pattern, textiter, de);
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!search.getPattern().equals(pattern)
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getTarget().equals(textiter)
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getCollator().equals(Collator.getInstance(de))
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*|| !search.getBreakIterator().equals(breaker)*/) {
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringSearch(String, StringCharacterIterator, Locale) "
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + "error");
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        search = new StringSearch(pattern, textiter, m_fr_fr_,
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                  m_en_wordbreaker_);
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!search.getPattern().equals(pattern)
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getTarget().equals(textiter)
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getCollator().equals(m_fr_fr_)
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !search.getBreakIterator().equals(m_en_wordbreaker_)) {
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringSearch(String, StringCharacterIterator, Locale) "
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + "error");
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBasic() {
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < BASIC.length; count++) {
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(BASIC[count])) {
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBreakIterator() {
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = BREAKITERATOREXACT[0].text;
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = BREAKITERATOREXACT[0].pattern;
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search");
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setBreakIterator(null);
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getBreakIterator() != null) {
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error usearch_getBreakIterator returned wrong object");
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setBreakIterator(m_en_characterbreaker_);
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getBreakIterator().equals(m_en_characterbreaker_)) {
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error usearch_getBreakIterator returned wrong object");
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setBreakIterator(m_en_wordbreaker_);
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getBreakIterator().equals(m_en_wordbreaker_)) {
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error usearch_getBreakIterator returned wrong object");
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count = 0;
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (count < 4) {
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // special purposes for tests numbers 0-3
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData        search   = BREAKITERATOREXACT[count];
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            RuleBasedCollator collator = getCollator(search.collator);
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BreakIterator     breaker  = getBreakIterator(search.breaker);
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  //StringSearch      strsrch;
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = search.text;
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = search.pattern;
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (breaker != null) {
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                breaker.setText(text);
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(search.strength);
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, breaker);
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.getBreakIterator() != breaker) {
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting break iterator");
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                collator.setStrength(TERTIARY);
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            search   = BREAKITERATOREXACT[count + 1];
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker  = getBreakIterator(search.breaker);
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (breaker != null) {
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                breaker.setText(text);
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setBreakIterator(breaker);
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.getBreakIterator() != breaker) {
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting break iterator");
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 errln("Error at test number " + count);
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            count += 2;
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < BREAKITERATOREXACT.length; count++) {
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(BREAKITERATOREXACT[count])) {
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBreakIteratorCanonical() {
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int        count  = 0;
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (count < 4) {
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // special purposes for tests numbers 0-3
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData     search   = BREAKITERATORCANONICAL[count];
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String text = search.text;
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = search.pattern;
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            RuleBasedCollator collator = getCollator(search.collator);
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(search.strength);
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BreakIterator breaker = getBreakIterator(search.breaker);
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringSearch  strsrch = null;
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, breaker);
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error creating string search data");
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!strsrch.getBreakIterator().equals(breaker)) {
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting break iterator");
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                collator.setStrength(TERTIARY);
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            search  = BREAKITERATOREXACT[count + 1];
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker = getBreakIterator(search.breaker);
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            breaker.setText(strsrch.getTarget());
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setBreakIterator(breaker);
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!strsrch.getBreakIterator().equals(breaker)) {
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting break iterator");
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 errln("Error at test number " + count);
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 return;
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            count += 2;
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < BREAKITERATORCANONICAL.length; count++) {
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             if (!assertEqual(BREAKITERATORCANONICAL[count])) {
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 errln("Error at test number " + count);
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 return;
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             }
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCanonical() {
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < BASICCANONICAL.length; count++) {
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(BASICCANONICAL[count])) {
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCollator() {
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test collator that thinks "o" and "p" are the same thing
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = COLLATOR[0].text;
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern  = COLLATOR[0].pattern;
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATOR[0])) {
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = TESTCOLLATORRULE;
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedCollator tailored = null;
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tailored = new RuleBasedCollator(rules);
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tailored.setStrength(COLLATOR[1].strength);
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening rule based collator ");
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCollator(tailored);
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getCollator().equals(tailored)) {
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting rule based collator");
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATOR[1])) {
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCollator(m_en_us_);
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getCollator().equals(m_en_us_)) {
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting rule based collator");
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATOR[0])) {
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           errln("Error searching collator test");
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCollatorCanonical() {
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* test collator that thinks "o" and "p" are the same thing */
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = COLLATORCANONICAL[0].text;
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = COLLATORCANONICAL[0].pattern;
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[0])) {
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = TESTCOLLATORRULE;
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedCollator tailored = null;
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tailored = new RuleBasedCollator(rules);
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tailored.setStrength(COLLATORCANONICAL[1].strength);
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tailored.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening rule based collator ");
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCollator(tailored);
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getCollator().equals(tailored)) {
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting rule based collator");
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[1])) {
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("COLLATORCANONICAL[1] failed");  // Error should already be reported.
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCollator(m_en_us_);
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.getCollator().equals(m_en_us_)) {
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting rule based collator");
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[0])) {
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("COLLATORCANONICAL[0] failed");  // Error should already be reported.
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompositeBoundaries() {
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < COMPOSITEBOUNDARIES.length; count++) {
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // logln("composite " + count);
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompositeBoundariesCanonical() {
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < COMPOSITEBOUNDARIESCANONICAL.length; count++) {
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // logln("composite " + count);
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestContraction() {
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = CONTRACTIONRULE;
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedCollator collator = null;
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator = new RuleBasedCollator(rules);
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(TERTIARY);
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening collator ");
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "text";
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "pattern";
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count< CONTRACTION.length; count++) {
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = CONTRACTION[count].text;
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = CONTRACTION[count].pattern;
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, CONTRACTION[count])) {
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestContractionCanonical() {
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = CONTRACTIONRULE;
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedCollator collator = null;
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator = new RuleBasedCollator(rules);
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(TERTIARY);
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening collator ");
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "text";
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "pattern";
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search");
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < CONTRACTIONCANONICAL.length; count++) {
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = CONTRACTIONCANONICAL[count].text;
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = CONTRACTIONCANONICAL[count].pattern;
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, CONTRACTIONCANONICAL[count])) {
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetMatch() {
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SearchData search = MATCH[0];
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = search.text;
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = search.pattern;
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int           count      = 0;
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int   matchindex = search.offset[count];
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String matchtext;
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (matchindex >= 0) {
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int matchlength = search.size[count];
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.next();
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchindex != strsrch.getMatchStart() ||
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                matchlength != strsrch.getMatchLength()) {
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + search.text);
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Pattern: " + strsrch.getPattern());
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            count++;
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchtext = strsrch.getMatchedText();
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (matchtext.length() != matchlength){
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting match text");
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            matchindex = search.offset[count];
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.next();
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getMatchStart()  != StringSearch.DONE ||
11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getMatchLength() != 0) {
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error end of match not found");
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        matchtext = strsrch.getMatchedText();
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (matchtext != null) {
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error getting null matches");
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetSetAttribute() {
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = "pattern";
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  text = "text";
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch = null;
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening search");
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.isOverlapping()) {
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error default overlaping should be false");
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setOverlapping(true);
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.isOverlapping()) {
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting overlap true");
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setOverlapping(false);
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.isOverlapping()) {
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting overlap false");
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strsrch.isCanonical()) {
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting canonical match true");
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(false);
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.isCanonical()) {
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting canonical match false");
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getElementComparisonType() != STANDARD_ELEMENT_COMPARISON) {
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error default element comparison type should be STANDARD_ELEMENT_COMPARISON");
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setElementComparisonType(ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD);
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getElementComparisonType() != ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD) {
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting element comparison type PATTERN_BASE_WEIGHT_IS_WILDCARD");
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetSetOffset() {
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = "1234567890123456";
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  text  = "12345678901234567890123456789012";
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch = null;
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening search");
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* testing out of bounds error */
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setIndex(-1);
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error expecting set offset error");
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IndexOutOfBoundsException e) {
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: strsrch.setIndex(-1) failed as expected");
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setIndex(128);
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error expecting set offset error");
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IndexOutOfBoundsException e) {
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: strsrch.setIndex(128) failed as expected");
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int index = 0; index < BASIC.length; index++) {
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData  search      = BASIC[index];
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text =search.text;
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = search.pattern;
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getCollator().setStrength(search.strength);
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int count = 0;
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int matchindex  = search.offset[count];
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (matchindex >= 0) {
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int matchlength = search.size[count];
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch.next();
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (matchindex != strsrch.getMatchStart() ||
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    matchlength != strsrch.getMatchLength()) {
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Text: " + text);
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Pattern: " + strsrch.getPattern());
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                matchindex = search.offset[count + 1] == -1 ? -1 :
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             search.offset[count + 2];
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (search.offset[count + 1] != -1) {
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    strsrch.setIndex(search.offset[count + 1] + 1);
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (strsrch.getIndex() != search.offset[count + 1] + 1) {
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error setting offset\n");
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        return;
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                count += 2;
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.next();
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.getMatchStart() != StringSearch.DONE) {
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + text);
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Pattern: " + strsrch.getPattern());
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.getCollator().setStrength(TERTIARY);
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetSetOffsetCanonical() {
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  text = "text";
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern = "pattern";
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch = null;
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail to open StringSearch!");
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //TODO: setCanonical is not sufficient for canonical match. See #10725
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.getCollator().setDecomposition(Collator.CANONICAL_DECOMPOSITION);
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* testing out of bounds error */
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setIndex(-1);
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error expecting set offset error");
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IndexOutOfBoundsException e) {
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: strsrch.setIndex(-1) failed as expected");
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setIndex(128);
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error expecting set offset error");
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IndexOutOfBoundsException e) {
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: strsrch.setIndex(128) failed as expected");
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int index = 0; index < BASICCANONICAL.length; index++) {
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData  search      = BASICCANONICAL[index];
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = search.text;
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = search.pattern;
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int         count       = 0;
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int matchindex  = search.offset[count];
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (matchindex >= 0) {
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int matchlength = search.size[count];
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch.next();
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (matchindex != strsrch.getMatchStart() ||
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    matchlength != strsrch.getMatchLength()) {
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Text: " + text);
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Pattern: " + strsrch.getPattern());
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                matchindex = search.offset[count + 1] == -1 ? -1 :
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             search.offset[count + 2];
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (search.offset[count + 1] != -1) {
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    strsrch.setIndex(search.offset[count + 1] + 1);
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (strsrch.getIndex() != search.offset[count + 1] + 1) {
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error setting offset");
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        return;
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                count += 2;
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.next();
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.getMatchStart() != StringSearch.DONE) {
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Text: " + text);
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Pattern: %s" + strsrch.getPattern());
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.getCollator().setStrength(TERTIARY);
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.getCollator().setDecomposition(Collator.NO_DECOMPOSITION);
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIgnorable() {
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = IGNORABLERULE;
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int        count  = 0;
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedCollator collator = null;
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator = new RuleBasedCollator(rules);
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setStrength(IGNORABLE[count].strength);
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening collator ");
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "pattern";
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "text";
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (; count < IGNORABLE.length; count++) {
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = IGNORABLE[count].text;
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = IGNORABLE[count].pattern;
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, IGNORABLE[count])) {
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestInitialization() {
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  pattern;
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  text;
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String  temp = "a";
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  result;
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* simple test on the pattern ce construction */
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern = temp + temp;
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text = temp + temp + temp;
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening search ");
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* testing if an extremely large pattern will fail the initialization */
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern = "";
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < 512; count ++) {
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern += temp;
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("pattern:" + result.getPattern());
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: an extremely large pattern will fail the initialization");
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNormCanonical() {
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < NORMCANONICAL.length; count++) {
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(NORMCANONICAL[count])) {
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setDecomposition(Collator.NO_DECOMPOSITION);
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNormExact() {
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count;
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < BASIC.length; count++) {
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(BASIC[count])) {
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < NORMEXACT.length; count++) {
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(NORMEXACT[count])) {
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setDecomposition(Collator.NO_DECOMPOSITION);
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < NONNORMEXACT.length; count++) {
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(NONNORMEXACT[count])) {
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestOpenClose() {
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch            result;
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator           breakiter = m_en_wordbreaker_;
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String           pattern = "";
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String           text = "";
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String           temp  = "a";
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringCharacterIterator  chariter= new StringCharacterIterator(text);
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* testing null arguments */
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null arguments should produce an error");
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: null arguments failed as expected");
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        chariter.setText(text);
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, null, null);
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null arguments should produce an error");
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: null arguments failed as expected");
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text  = String.valueOf(0x1);
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Empty pattern should produce an error");
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: Empty pattern failed as expected");
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        chariter.setText(text);
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, null, null);
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Empty pattern should produce an error");
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: Empty pattern failed as expected");
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text = "";
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern =temp;
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Empty text should produce an error");
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: Empty text failed as expected");
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        chariter.setText(text);
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, null, null);
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Empty text should produce an error");
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: Empty text failed as expected");
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text += temp;
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null arguments should produce an error");
14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: null arguments failed as expected");
14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        chariter.setText(text);
14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, null, null);
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null arguments should produce an error");
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: null arguments failed as expected");
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null break iterator is valid for opening search");
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, m_en_us_, null);
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null break iterator is valid for opening search");
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), Locale.ENGLISH);
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null break iterator is valid for opening search");
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, Locale.ENGLISH);
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: null break iterator is valid for opening search");
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, breakiter);
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Break iterator is valid for opening search");
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = new StringSearch(pattern, chariter, m_en_us_, null);
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("pattern:" + result.getPattern());
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error: Break iterator is valid for opening search");
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestOverlap() {
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count;
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < OVERLAP.length; count++) {
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithAttribute(OVERLAP[count], false, true)) {
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at overlap test number " + count);
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < NONOVERLAP.length; count++) {
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(NONOVERLAP[count])) {
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at non overlap test number " + count);
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < OVERLAP.length && count < NONOVERLAP.length; count++) {
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData search = (OVERLAP[count]);
15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String text = search.text;
15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = search.pattern;
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            RuleBasedCollator collator = getCollator(search.collator);
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringSearch strsrch = null;
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch  = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error open StringSearch");
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setOverlapping(true);
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!strsrch.isOverlapping()) {
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting overlap option");
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            search = NONOVERLAP[count];
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setOverlapping(false);
15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.isOverlapping()) {
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting overlap option");
15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             }
15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestOverlapCanonical() {
15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count;
15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < OVERLAPCANONICAL.length; count++) {
15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], true, true)) {
15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at overlap test number %d" + count);
15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < NONOVERLAP.length; count++) {
15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at non overlap test number %d" + count);
15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (count = 0; count < OVERLAPCANONICAL.length && count < NONOVERLAPCANONICAL.length; count++) {
15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData search = OVERLAPCANONICAL[count];
15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            RuleBasedCollator collator = getCollator(search.collator);
15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringSearch strsrch = new StringSearch(search.pattern, new StringCharacterIterator(search.text), collator, null);
15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCanonical(true);
15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setOverlapping(true);
15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.isOverlapping() != true) {
15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting overlap option");
15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
15947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            search = NONOVERLAPCANONICAL[count];
15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setOverlapping(false);
15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.isOverlapping() != false) {
15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error setting overlap option");
16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, search)) {
16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number %d" + count);
16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             }
16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPattern() {
16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setStrength(PATTERN[0].strength);
16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = new StringSearch(PATTERN[0].pattern, new StringCharacterIterator(PATTERN[0].text), m_en_us_, null);
16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getPattern() != PATTERN[0].pattern) {
16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERN[0])) {
16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch != null) {
16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setPattern(PATTERN[1].pattern);
16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (PATTERN[1].pattern != strsrch.getPattern()) {
16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch != null) {
16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERN[1])) {
16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch != null) {
16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setPattern(PATTERN[0].pattern);
16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (PATTERN[0].pattern != strsrch.getPattern()) {
16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch != null) {
16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERN[0])) {
16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch != null) {
16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                strsrch = null;
16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* enormous pattern size to see if this crashes */
16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "";
16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int templength = 0; templength != 512; templength ++) {
16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern += 0x61;
16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(Exception e) {
16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern with size 512");
16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setStrength(TERTIARY);
16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch != null) {
16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatternCanonical() {
16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //StringCharacterIterator text = new StringCharacterIterator(PATTERNCANONICAL[0].text);
16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setStrength(PATTERNCANONICAL[0].strength);
16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = new StringSearch(PATTERNCANONICAL[0].pattern, new StringCharacterIterator(PATTERNCANONICAL[0].text),
16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                m_en_us_, null);
16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (PATTERNCANONICAL[0].pattern != strsrch.getPattern()) {
16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[0])) {
16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setPattern(PATTERNCANONICAL[1].pattern);
16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (PATTERNCANONICAL[1].pattern != strsrch.getPattern()) {
16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[1])) {
17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setPattern(PATTERNCANONICAL[0].pattern);
17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (PATTERNCANONICAL[0].pattern != strsrch.getPattern()) {
17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting pattern");
17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[0])) {
17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            m_en_us_.setStrength(TERTIARY);
17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestReset() {
17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringCharacterIterator text = new StringCharacterIterator("fish fish");
17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "s";
17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch  strsrch = new StringSearch(pattern, text, m_en_us_, null);
17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setOverlapping(true);
17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setIndex(9);
17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.reset();
17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.isCanonical() || strsrch.isOverlapping() ||
17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getIndex() != 0 || strsrch.getMatchLength() != 0 ||
17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getMatchStart() != SearchIterator.DONE) {
17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error resetting string search");
17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.previous();
17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (strsrch.getMatchStart() != 7 || strsrch.getMatchLength() != 1) {
17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error resetting string search\n");
17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetMatch() {
17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < MATCH.length; count++) {
17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SearchData     search = MATCH[count];
17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringSearch strsrch = new StringSearch(search.pattern, new StringCharacterIterator(search.text),
17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                    m_en_us_, null);
17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int size = 0;
17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (search.offset[size] != -1) {
17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                size ++;
17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.first() != search.offset[0]) {
17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting first match");
17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.last() != search.offset[size -1]) {
17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting last match");
17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int index = 0;
17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (index < size) {
17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (index + 2 < size) {
17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (strsrch.following(search.offset[index + 2] - 1) != search.offset[index + 2]) {
17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error getting following match at index " + (search.offset[index + 2]-1));
17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (index + 1 < size) {
17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (strsrch.preceding(search.offset[index + 1] + search.size[index + 1] + 1) != search.offset[index + 1]) {
17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error getting preceeding match at index " + (search.offset[index + 1] + 1));
17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                index += 2;
17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.following(search.text.length()) != SearchIterator.DONE) {
17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error expecting out of bounds match");
17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (strsrch.preceding(0) != SearchIterator.DONE) {
17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error expecting out of bounds match");
17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStrength() {
17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < STRENGTH.length; count++) {
17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(STRENGTH[count])) {
17937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStrengthCanonical() {
17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < STRENGTHCANONICAL.length; count++) {
18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number" + count);
18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSupplementary() {
18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < SUPPLEMENTARY.length; count++) {
18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(SUPPLEMENTARY[count])) {
18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSupplementaryCanonical() {
18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < SUPPLEMENTARYCANONICAL.length; count++) {
18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number" + count);
18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestText() {
18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SearchData TEXT[] = {
18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SD("the foxy brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 15, -1), IA(3, 3)),
18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SD("the quick brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, -1), IA(3))
18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringCharacterIterator t = new StringCharacterIterator(TEXT[0].text);
18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = new StringSearch(TEXT[0].pattern, t, m_en_us_, null);
18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!t.equals(strsrch.getTarget())) {
18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting text");
18327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, TEXT[0])) {
18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error at assertEqualWithStringSearch");
18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t = new StringCharacterIterator(TEXT[1].text);
18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setTarget(t);
18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!t.equals(strsrch.getTarget())) {
18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting text");
18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, TEXT[1])) {
18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error at assertEqualWithStringSearch");
18477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestTextCanonical() {
18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringCharacterIterator t = new StringCharacterIterator(TEXTCANONICAL[0].text);
18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = new StringSearch(TEXTCANONICAL[0].pattern, t, m_en_us_, null);
18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setCanonical(true);
18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!t.equals(strsrch.getTarget())) {
18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting text");
18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[0])) {
18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t = new StringCharacterIterator(TEXTCANONICAL[1].text);
18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setTarget(t);
18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!t.equals(strsrch.getTarget())) {
18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting text");
18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[1])) {
18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        t = new StringCharacterIterator(TEXTCANONICAL[0].text);
18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        strsrch.setTarget(t);
18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!t.equals(strsrch.getTarget())) {
18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error setting text");
18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[0])) {
18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error at assertEqualWithStringSearch");
18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = null;
18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestVariable() {
18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setAlternateHandlingShifted(true);
18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < VARIABLE.length; count++) {
18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // logln("variable" + count);
18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqual(VARIABLE[count])) {
18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setAlternateHandlingShifted(false);
19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestVariableCanonical() {
19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setAlternateHandlingShifted(true);
19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < VARIABLE.length; count++) {
19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // logln("variable " + count);
19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertCanonicalEqual(VARIABLE[count])) {
19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m_en_us_.setAlternateHandlingShifted(false);
19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSubClass()
19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestSearch extends SearchIterator
19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern;
19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String text;
19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestSearch(StringCharacterIterator target, BreakIterator breaker,
19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       String pattern)
19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                super(target, breaker);
19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                this.pattern = pattern;
19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer buffer = new StringBuffer();
19277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while (targetText.getIndex() != targetText.getEndIndex()) {
19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    buffer.append(targetText.current());
19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    targetText.next();
19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                text = buffer.toString();
19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                targetText.setIndex(targetText.getBeginIndex());
19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            protected int handleNext(int start)
19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int match = text.indexOf(pattern, start);
19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (match < 0) {
19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    targetText.last();
19397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return DONE;
19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                targetText.setIndex(match);
19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                setMatchLength(pattern.length());
19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return match;
19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            protected int handlePrevious(int start)
19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int match = text.lastIndexOf(pattern, start - 1);
19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (match < 0) {
19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    targetText.setIndex(0);
19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return DONE;
19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                targetText.setIndex(match);
19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                setMatchLength(pattern.length());
19547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return match;
19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int getIndex()
19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int result = targetText.getIndex();
19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (result < 0 || result >= text.length()) {
19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return DONE;
19627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return result;
19647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestSearch search = new TestSearch(
19687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new StringCharacterIterator("abc abcd abc"),
19697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            null, "abc");
19707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int expected[] = {0, 4, 9};
19717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < expected.length; i ++) {
19727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (search.next() != expected[i]) {
19737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting next match");
19747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (search.getMatchLength() != search.pattern.length()) {
19767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting next match length");
19777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (search.next() != SearchIterator.DONE) {
19807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error should have reached the end of the iteration");
19817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = expected.length - 1; i >= 0; i --) {
19837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (search.previous() != expected[i]) {
19847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting next match");
19857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (search.getMatchLength() != search.pattern.length()) {
19877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error getting next match length");
19887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (search.previous() != SearchIterator.DONE) {
19917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error should have reached the start of the iteration");
19927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //Test for ticket 5024
19967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDiactricMatch() {
19977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "pattern";
19987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "text";
19997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringSearch strsrch = null;
20007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
20017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch = new StringSearch(pattern, text);
20027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
20037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error opening string search ");
20047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
20057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < DIACTRICMATCH.length; count++) {
20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setCollator(getCollator(DIACTRICMATCH[count].collator));
20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.getCollator().setStrength(DIACTRICMATCH[count].strength);
20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setBreakIterator(getBreakIterator(DIACTRICMATCH[count].breaker));
20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.reset();
20127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            text = DIACTRICMATCH[count].text;
20137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pattern = DIACTRICMATCH[count].pattern;
20147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setTarget(new StringCharacterIterator(text));
20157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strsrch.setPattern(pattern);
20167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!assertEqualWithStringSearch(strsrch, DIACTRICMATCH[count])) {
20177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error at test number " + count);
20187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
20217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUsingSearchCollator() {
20237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoText =
20247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            " " +
20257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*01*/  "\uAC00 " +                   // simple LV Hangul
20267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*03*/  "\uAC01 " +                   // simple LVT Hangul
20277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*05*/  "\uAC0F " +                   // LVTT, last jamo expands for search
20287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*07*/  "\uAFFF " +                   // LLVVVTT, every jamo expands for search
20297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*09*/  "\u1100\u1161\u11A8 " +       // 0xAC01 as conjoining jamo
20307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*13*/  "\u1100\u1161\u1100 " +       // 0xAC01 as basic conjoining jamo (per search rules)
20317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*17*/  "\u3131\u314F\u3131 " +       // 0xAC01 as compatibility jamo
20327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*21*/  "\u1100\u1161\u11B6 " +       // 0xAC0F as conjoining jamo; last expands for search
20337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*25*/  "\u1100\u1161\u1105\u1112 " + // 0xAC0F as basic conjoining jamo; last expands for search
20347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*30*/  "\u1101\u1170\u11B6 " +       // 0xAFFF as conjoining jamo; all expand for search
20357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*34*/  "\u00E6 " +                   // small letter ae, expands
20367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*36*/  "\u1E4D " +                   // small letter o with tilde and acute, decomposes
20377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "";
20387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat0 = "\uAC01";
20407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat1 = "\u1100\u1161\u11A8"; // 0xAC01 as conjoining jamo
20417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat2 = "\uAC0F";
20427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat3 = "\u1100\u1161\u1105\u1112"; // 0xAC0F as basic conjoining jamo
20437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat4 = "\uAFFF";
20447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String scKoPat5 = "\u1101\u1170\u11B6"; // 0xAFFF as conjoining jamo
20457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoSrchOff01 = { 3,  9, 13 };
20477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoSrchOff23 = { 5, 21, 25 };
20487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoSrchOff45 = { 7, 30     };
20497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoStndOff01 = { 3,  9 };
20517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoStndOff2  = { 5, 21 };
20527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoStndOff3  = { 25    };
20537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] scKoStndOff45 = { 7, 30 };
20547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class PatternAndOffsets {
20567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private String pattern;
20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private int[] offsets;
20587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            PatternAndOffsets(String pat, int[] offs) {
20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pattern = pat;
20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                offsets = offs;
20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getPattern() { return pattern; }
20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public int[] getOffsets() { return offsets; }
20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final PatternAndOffsets[] scKoSrchPatternsOffsets = {
20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat0, scKoSrchOff01 ),
20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat1, scKoSrchOff01 ),
20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat2, scKoSrchOff23 ),
20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat3, scKoSrchOff23 ),
20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat4, scKoSrchOff45 ),
20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat5, scKoSrchOff45 ),
20727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final PatternAndOffsets[] scKoStndPatternsOffsets = {
20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat0, scKoStndOff01 ),
20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat1, scKoStndOff01 ),
20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat2, scKoStndOff2  ),
20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat3, scKoStndOff3  ),
20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat4, scKoStndOff45 ),
20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndOffsets( scKoPat5, scKoStndOff45 ),
20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TUSCItem {
20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private String localeString;
20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private String text;
20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private PatternAndOffsets[] patternsAndOffsets;
20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TUSCItem(String locStr, String txt, PatternAndOffsets[] patsAndOffs) {
20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                localeString = locStr;
20887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                text = txt;
20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                patternsAndOffsets = patsAndOffs;
20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getLocaleString() { return localeString; }
20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getText() { return text; }
20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public PatternAndOffsets[] getPatternsAndOffsets() { return patternsAndOffsets; }
20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final TUSCItem[] tuscItems = {
20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TUSCItem( "root",                  scKoText, scKoStndPatternsOffsets ),
20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TUSCItem( "root@collation=search", scKoText, scKoSrchPatternsOffsets ),
20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TUSCItem( "ko@collation=search",   scKoText, scKoSrchPatternsOffsets ),
20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dummyPat = "a";
21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (TUSCItem tuscItem: tuscItems) {
21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String localeString = tuscItem.getLocaleString();
21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale uloc = new ULocale(localeString);
21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            RuleBasedCollator col = null;
21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                col = (RuleBasedCollator)Collator.getInstance(uloc);
21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Error: in locale " + localeString + ", err in Collator.getInstance");
21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringCharacterIterator ci = new StringCharacterIterator(tuscItem.getText());
21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringSearch srch = new StringSearch(dummyPat, ci, col);
21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for ( PatternAndOffsets patternAndOffsets: tuscItem.getPatternsAndOffsets() ) {
21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                srch.setPattern(patternAndOffsets.getPattern());
21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int[] offsets = patternAndOffsets.getOffsets();
21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int ioff, noff = offsets.length;
21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int offset;
21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                srch.reset();
21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ioff = 0;
21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while (true) {
21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    offset = srch.next();
21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (offset == SearchIterator.DONE) {
21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if ( ioff < noff ) {
21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if ( offset != offsets[ioff] ) {
21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            errln("Error: in locale " + localeString + ", expected SearchIterator.next() " + offsets[ioff] + ", got " + offset);
21317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            //ioff = noff;
21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            //break;
21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ioff++;
21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error: in locale " + localeString + ", SearchIterator.next() returned more matches than expected");
21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( ioff < noff ) {
21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Error: in locale " + localeString + ", SearchIterator.next() returned fewer matches than expected");
21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                srch.reset();
21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ioff = noff;
21457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while (true) {
21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    offset = srch.previous();
21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (offset == SearchIterator.DONE) {
21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if ( ioff > 0 ) {
21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ioff--;
21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if ( offset != offsets[ioff] ) {
21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             errln("Error: in locale " + localeString + ", expected SearchIterator.previous() " + offsets[ioff] + ", got " + offset);
21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            //ioff = 0;
21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // break;
21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Error: in locale " + localeString + ", expected SearchIterator.previous() returned more matches than expected");
21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ( ioff > 0 ) {
21627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Error: in locale " + localeString + ", expected SearchIterator.previous() returned fewer matches than expected");
21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2171