1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2000-2015, International Business Machines Corporation and    *
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.                                                *
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Port From:   ICU4C v2.1 : collate/StringSearchTest
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Source File: $ICU4CRoot/source/test/intltest/srchtest.cpp
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin **/
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.search;
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.Collator.IDENTICAL;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.Collator.PRIMARY;
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.Collator.QUATERNARY;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.Collator.SECONDARY;
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.Collator.TERTIARY;
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.SearchIterator.ElementComparisonType.ANY_BASE_WEIGHT_IS_WILDCARD;
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.SearchIterator.ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD;
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport static android.icu.text.SearchIterator.ElementComparisonType.STANDARD_ELEMENT_COMPARISON;
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
27495cb271e305cfb399d463f32210a371198f0abfFredrik Roubertimport java.text.CharacterIterator;
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.text.StringCharacterIterator;
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
31f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Before;
32f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
3305fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runner.RunWith;
3405fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runners.JUnit4;
35f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk;
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.BreakIterator;
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Collator;
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.RuleBasedCollator;
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.SearchIterator;
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.SearchIterator.ElementComparisonType;
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.StringSearch;
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.ULocale;
442e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard;
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
462e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard
4705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert@RunWith(JUnit4.class)
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class SearchTest extends TestFmwk {
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //inner class
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static class SearchData {
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SearchData(String text, String pattern,
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    String coll, int strength, ElementComparisonType cmpType, String breaker,
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    int[] offset, int[] size) {
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.text = text;
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.pattern = pattern;
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.collator = coll;
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.strength = strength;
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.cmpType = cmpType;
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.breaker = breaker;
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.offset = offset;
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.size = size;
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String              text;
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String              pattern;
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String              collator;
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int                 strength;
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        ElementComparisonType   cmpType;
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String              breaker;
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[]               offset;
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[]               size;
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    RuleBasedCollator m_en_us_;
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    RuleBasedCollator m_fr_fr_;
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    RuleBasedCollator m_de_;
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    RuleBasedCollator m_es_;
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    BreakIterator     m_en_wordbreaker_;
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    BreakIterator     m_en_characterbreaker_;
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Just calling SearchData constructor, to make the test data source code
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // nice and short
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static SearchData SD(String text, String pattern, String coll, int strength,
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    ElementComparisonType cmpType, String breaker, int[] offset, int[] size) {
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return new SearchData(text, pattern, coll, strength, cmpType, breaker, offset, size);
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // Just returning int[], to make the test data nice and short
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static int[] IA(int... elements) {
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return elements;
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static SearchData[] BASIC = {
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("xxxxxxxxxxxxxxxxxxxx", "fisher", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, -1), IA(6)),
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly spring string string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, 20, -1), IA(6, 6)),
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(6, 20, -1), IA(6, 6)),
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 14, -1), IA(6, 6)),
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Scott Ganyo", "c", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Scott Ganyo", " ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(5, -1), IA(1)),
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300b", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00c9", "e", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData BREAKITERATOREXACT[] = {
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, 5, -1), IA(3, 3)),
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(5, -1), IA(3)),
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(10, 14, -1), IA(3, 2)),
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(10, -1), IA(3)),
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Channel, another channel, more channels, and one last Channel", "Channel", "es", TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(0, 54, -1), IA(7, 7)),
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* jitterbug 1745 */
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("testing that \u00e9 does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 17, 30, -1), IA(1, 1, 1)),
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00c9", "e", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, -1), IA(1)),
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData BREAKITERATORCANONICAL[] = {
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, 5, -1), IA(3, 3)),
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("foxy fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(5, -1), IA(3)),
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(10, 14, -1), IA(3, 2)),
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(10, -1), IA(3)),
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Channel, another channel, more channels, and one last Channel", "Channel", "es", TERTIARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(0, 54, -1), IA(7, 7)),
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* jitterbug 1745 */
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("testing that \u00e9 does not match e", "e", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(1, 17, 30, -1), IA(1, 1, 1)),
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00c9", "e", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, "characterbreaker", IA(0, -1), IA(1)),
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData BASICCANONICAL[] = {
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("xxxxxxxxxxxxxxxxxxxx", "fisher", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, -1), IA(6)),
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly spring string string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(13, 20, -1), IA(6, 6)),
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("silly string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(6, 20, -1), IA(6, 6)),
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("string spring string", "string", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 14, -1), IA(6, 6)),
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Scott Ganyo", "c", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("Scott Ganyo", " ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(5, -1), IA(1)),
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300b", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325b", "\u0300b", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0325\u0300A\u0325\u0300", "\u0300A\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0325\u0300A\u0325\u0300", "\u0325A\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325b\u0300\u0325c \u0325b\u0300 \u0300b\u0325", "\u0300b\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00c4\u0323", "A\u0323\u0308", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0308\u0323", "\u0323\u0308", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData COLLATOR[] = {
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* english */
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("fox fpx", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* tailored */
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("fox fpx", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(3, 3)),
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    String TESTCOLLATORRULE = "& o,O ; p,P";
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    String EXTRACOLLATIONRULE = " & ae ; \u00e4 & AE ; \u00c4 & oe ; \u00f6 & OE ; \u00d6 & ue ; \u00fc & UE ; \u00dc";
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData COLLATORCANONICAL[] = {
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* english */
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("fox fpx", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* tailored */
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("fox fpx", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(3, 3)),
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData COMPOSITEBOUNDARIES[] = {
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u00C0C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0A", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("B\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0B", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* first one matches only because it's at the start of the text */
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* \\u0300 blocked by \\u0300 */
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0\u0300", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* A + 030A + 0301 */
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u01FA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030AA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* blocked accent */
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FAA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F73", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F71\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0F73", "A\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73A", "\u0F72A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA A\u0301\u030A A\u030A\u0301 A\u030A \u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, -1), IA(2)),
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData COMPOSITEBOUNDARIESCANONICAL[] = {
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u00C0C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0A", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(1)),
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("B\u00C0", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0B", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* first one matches only because it's at the start of the text */
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u00C0", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* \u0300 blocked by \u0300 */
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00C0\u0300", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* A + 030A + 0301 */
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u01FA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030AA", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* blocked accent */
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA", "\u030A\u0301", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FAA", "\u0301A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F73", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73", "\u0F71\u0F72", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(1)),
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0F73", "A\u0F71", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0F73A", "\u0F72A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u01FA A\u0301\u030A A\u030A\u0301 A\u030A \u01FA", "A\u030A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, -1), IA(2)),
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData SUPPLEMENTARY[] = {
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abc \uD800\uDC00 \uD800\uDC01 \uD801\uDC00 \uD800\uDC00abc abc\uD800\uDC00 \uD800\uD800\uDC00 \uD800\uDC00\uDC00",
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\uD800\uDC00", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 13, 22, 26, 29, -1), IA(2, 2, 2, 2, 2)),
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and\uD834\uDDB9this sentence", "\uD834\uDDB9", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(2)),
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and \uD834\uDDB9 this sentence", " \uD834\uDDB9 ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and-\uD834\uDDB9-this sentence", "-\uD834\uDDB9-", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and,\uD834\uDDB9,this sentence", ",\uD834\uDDB9,", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and?\uD834\uDDB9?this sentence", "?\uD834\uDDB9?", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    String CONTRACTIONRULE = "&z = ab/c < AB < X\u0300 < ABC < X\u0300\u0315";
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData CONTRACTION[] = {
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* common discontiguous */
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0300\u0315", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0300\u0315", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* contraction prefix */
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "AB", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * discontiguous problem here for backwards iteration. accents not found because discontiguous stores all
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * information
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0300\u0319\u0315", "\u0319", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* ends not with a contraction character */
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0315\u0300D", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0315\u0300D", "X\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0300\u031A\u0315D", "X\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* blocked discontiguous */
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0300\u031A\u0315D", "\u031A\u0315D", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * "ab" generates a contraction that's an expansion. The "z" matches the first CE of the expansion but the
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * match fails because it ends in the middle of an expansion...
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("ab", "z", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData CONTRACTIONCANONICAL[] = {
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* common discontiguous */
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0300\u0315", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("A\u0300\u0315", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* contraction prefix */
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "A", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "AB", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("AB\u0315C", "\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * discontiguous problem here for backwards iteration. forwards gives 0, 4 but backwards give 1, 3
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * {"X\u0300\u0319\u0315", "\u0319", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, {0, -1), {4}),
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* ends not with a contraction character */
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0315\u0300D", "\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0315\u0300D", "X\u0300\u0315", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0300\u031A\u0315D", "X\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* blocked discontiguous */
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("X\u0300\u031A\u0315D", "\u031A\u0315D", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * "ab" generates a contraction that's an expansion. The "z" matches the first CE of the expansion but the
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * match fails because it ends in the middle of an expansion...
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("ab", "z", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(2)),
337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData MATCH[] = {
340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a busy bee is a very busy beeee", "bee", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(7, 26, -1), IA(3, 3)),
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890 */
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    String IGNORABLERULE = "&a = \u0300";
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData IGNORABLE[] = {
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * This isn't much of a test when matches have to be on grapheme boundiaries. The match at 0 only works because it's
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * at the start of the text.
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u0315 \u0300\u0315 ", "\u0300", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(2)),
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData DIACTRICMATCH[] = {
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0061\u0061\u00E1", "\u0061\u00E1", null, SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(2)),
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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",
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            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)),
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData NORMCANONICAL[] = {
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0300\u0325", "\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0325", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData NORMEXACT[] = {
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "a\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, -1), IA(3)),
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData NONNORMEXACT[] = {
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("a\u0300\u0325", "\u0325\u0300", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData OVERLAP[] = {
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 2, 4, -1), IA(4, 4, 4)),
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData NONOVERLAP[] = {
384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(4, 4)),
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData OVERLAPCANONICAL[] = {
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 2, 4, -1), IA(4, 4, 4)),
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData NONOVERLAPCANONICAL[] = {
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abababab", "abab", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 4, -1), IA(4, 4)),
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData PATTERNCANONICAL[] = {
396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "the", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 31, -1), IA(3, 3)),
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData PATTERN[] = {
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "the", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 31, -1), IA(3, 3)),
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    String PECHE_WITH_ACCENTS = "un p\u00E9ch\u00E9, "
406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "\u00E7a p\u00E8che par, "
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "p\u00E9cher, "
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "une p\u00EAche, "
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "un p\u00EAcher, "
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "j\u2019ai p\u00EAch\u00E9, "
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "un p\u00E9cheur, "
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "\u201Cp\u00E9che\u201D, "
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "decomp peche\u0301, "
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                + "base peche";
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    // in the above, the interesting words and their offsets are:
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    3 pe<301>che<301>
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    13 pe<300>che
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    24 pe<301>cher
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    36 pe<302>che
420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    46 pe<302>cher
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    59 pe<302>che<301>
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    69 pe<301>cheur
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    79 pe<301>che
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    94 peche<+301>
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //    107 peche
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData STRENGTH[] = {
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890123456789 */
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(16, -1), IA(3)),
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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",
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(15, 21, 27, 34, -1), IA(5, 5, 5, 5)),
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, 14, -1), IA(3, 2)),
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u00c0 should match but not A", "A\u0300", "en", IDENTICAL, STANDARD_ELEMENT_COMPARISON,  null, IA(0, -1), IA(1, 0)),
436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* some tests for modified element comparison, ticket #7093 */
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(107, -1), IA(5)),
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(24, 69, 79, -1), IA(5, 5, 5)),
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(79, -1), IA(5)),
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, -1), IA(5, 5)),
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche\u0301", "en", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* more tests for modified element comparison (with fr), ticket #7093 */
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(107, -1), IA(5)),
462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(24, 69, 79, -1), IA(5, 5, 5)),
465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(79, -1), IA(5)),
466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "p\u00E9che", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 79, -1), IA(5, 5)),
468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "pech\u00E9", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, null, IA(3, 59, 94, -1), IA(5, 5, 6)),
475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(PECHE_WITH_ACCENTS, "peche\u0301", "fr", SECONDARY, PATTERN_BASE_WEIGHT_IS_WILDCARD, "wordbreaker", IA(3, 59, 94, -1), IA(5, 5, 6)),
476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData STRENGTHCANONICAL[] = {
482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890123456789 */
483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, 40, -1), IA(3, 3)),
484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("The quick brown fox jumps over the lazy foxes", "fox", "en", PRIMARY, STANDARD_ELEMENT_COMPARISON, "wordbreaker", IA(16, -1), IA(3)),
485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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",
486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "peche", "fr", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(15, 21, 27, 34, -1), IA(5, 5, 5, 5)),
487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("This is a toe T\u00F6ne", "toe", "de", PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(10, 14, -1), IA(3, 2)),
488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    SearchData SUPPLEMENTARYCANONICAL[] = {
492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890012345678901234567890123456789012345678901234567890012345678901234567890123456789 */
493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abc \uD800\uDC00 \uD800\uDC01 \uD801\uDC00 \uD800\uDC00abc abc\uD800\uDC00 \uD800\uD800\uDC00 \uD800\uDC00\uDC00", "\uD800\uDC00",
494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 13, 22, 26, 29, -1), IA(2, 2, 2, 2, 2)),
495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and\uD834\uDDB9this sentence", "\uD834\uDDB9", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(2)),
496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and \uD834\uDDB9 this sentence", " \uD834\uDDB9 ", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and-\uD834\uDDB9-this sentence", "-\uD834\uDDB9-", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and,\uD834\uDDB9,this sentence", ",\uD834\uDDB9,", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("and?\uD834\uDDB9?this sentence", "?\uD834\uDDB9?", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(3, -1), IA(4)),
500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static SearchData VARIABLE[] = {
503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890123456789 */
504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*
507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * to see that it doesn't go into an infinite loop if the start of text is a ignorable character
508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(" on", "go", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("abcdefghijklmnopqrstuvwxyz", "   ",
511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null,
512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            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),
513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            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)),
514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* testing tightest match */
516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD(" abc  a bc   ab c    a  bc     ab  c", "abc", null, QUATERNARY, STANDARD_ELEMENT_COMPARISON, null, IA(1, -1), IA(3)),
517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /*  012345678901234567890123456789012345678901234567890123456789 */
518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        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)),
519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* totally ignorable text */
521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("           ---------------", "abc", null, SECONDARY, STANDARD_ELEMENT_COMPARISON, null, IA(-1), IA(0)),
522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static SearchData TEXTCANONICAL[] = {
525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("the foxy brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 15, -1), IA(3, 3)),
526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("the quick brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, -1), IA(3)),
527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static SearchData INDICPREFIXMATCH[] = {
530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0915\u0020\u0915\u0901\u0020\u0915\u0902\u0020\u0915\u0903\u0020\u0915\u0940\u0020\u0915\u093F\u0020\u0915\u0943\u0020\u0915\u093C\u0020\u0958",
531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u0915", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 2, 5, 8, 11, 14, 17, 20, 23,-1), IA(1, 2, 2, 2, 1, 1, 1, 2, 1)),
532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0915\u0924\u0020\u0915\u0924\u0940\u0020\u0915\u0924\u093F\u0020\u0915\u0924\u0947\u0020\u0915\u0943\u0924\u0020\u0915\u0943\u0924\u0947",
533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u0915\u0924", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(0, 3, 7, 11, -1), IA(2, 2, 2, 2)),
534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SD("\u0915\u0924\u0020\u0915\u0924\u0940\u0020\u0915\u0924\u093F\u0020\u0915\u0924\u0947\u0020\u0915\u0943\u0924\u0020\u0915\u0943\u0924\u0947",
535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                "\u0915\u0943\u0924", null, PRIMARY, STANDARD_ELEMENT_COMPARISON, null, IA(15, 19, -1), IA(3, 3)),
536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Constructor
540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public SearchTest()
542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
546f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Before
547f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    public void init() throws Exception {
548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_ = (RuleBasedCollator)Collator.getInstance(Locale.US);
549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_fr_fr_ = (RuleBasedCollator)Collator.getInstance(Locale.FRANCE);
550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_de_ = (RuleBasedCollator)Collator.getInstance(new Locale("de", "DE"));
551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_es_ = (RuleBasedCollator)Collator.getInstance(new Locale("es", "ES"));
552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_wordbreaker_ = BreakIterator.getWordInstance();
553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_characterbreaker_ = BreakIterator.getCharacterInstance();
554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = m_de_.getRules() + EXTRACOLLATIONRULE;
555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_de_ = new RuleBasedCollator(rules);
556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        rules = m_es_.getRules() + EXTRACOLLATIONRULE;
557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_es_ = new RuleBasedCollator(rules);
558aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    RuleBasedCollator getCollator(String collator) {
562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (collator == null) {
563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_en_us_;
564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } if (collator.equals("fr")) {
565aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_fr_fr_;
566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else if (collator.equals("de")) {
567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_de_;
568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else if (collator.equals("es")) {
569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_es_;
570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else {
571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_en_us_;
572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    BreakIterator getBreakIterator(String breaker) {
576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (breaker == null) {
577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return null;
578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } if (breaker.equals("wordbreaker")) {
579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_en_wordbreaker_;
580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else {
581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return m_en_characterbreaker_;
582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    boolean assertCanonicalEqual(SearchData search) {
586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator      collator = getCollator(search.collator);
587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BreakIterator breaker  = getBreakIterator(search.breaker);
588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch;
589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = search.text;
591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = search.pattern;
592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (breaker != null) {
594aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker.setText(text);
595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(search.strength);
597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setElementComparisonType(search.cmpType);
601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search" + e.getMessage());
604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, search)) {
608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(TERTIARY);
609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setDecomposition(Collator.NO_DECOMPOSITION);
610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(TERTIARY);
613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setDecomposition(Collator.NO_DECOMPOSITION);
614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return true;
615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    boolean assertEqual(SearchData search) {
618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator      collator = getCollator(search.collator);
619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BreakIterator breaker  = getBreakIterator(search.breaker);
620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch;
621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = search.text;
623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = search.pattern;
624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (breaker != null) {
626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker.setText(text);
627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(search.strength);
629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setElementComparisonType(search.cmpType);
632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search " + e.getMessage());
634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, search)) {
638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(TERTIARY);
639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(TERTIARY);
642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return true;
643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    boolean assertEqualWithAttribute(SearchData search, boolean canonical, boolean overlap) {
646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator      collator = getCollator(search.collator);
647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BreakIterator breaker  = getBreakIterator(search.breaker);
648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch;
649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = search.text;
651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = search.pattern;
652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (breaker != null) {
654aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker.setText(text);
655aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
656aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(search.strength);
657aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
658aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), (RuleBasedCollator)collator, breaker);
659aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(canonical);
660aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setOverlapping(overlap);
661aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setElementComparisonType(search.cmpType);
662aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
663aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search " + e.getMessage());
664aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
665aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
666aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
667aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, search)) {
668aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(TERTIARY);
669aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return false;
670aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
671aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        collator.setStrength(TERTIARY);
672aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return true;
673aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
674aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
675aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    boolean assertEqualWithStringSearch(StringSearch strsrch, SearchData search) {
676aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int           count       = 0;
677aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int   matchindex  = search.offset[count];
678aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String matchtext;
679aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
680aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getMatchStart() != SearchIterator.DONE ||
681aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getMatchLength() != 0) {
682aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error with the initialization of match start and length");
683aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
684aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // start of following matches
685aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchindex >= 0) {
686aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int matchlength = search.size[count];
687aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.next();
688aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            //int x = strsrch.getMatchStart();
689aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchindex != strsrch.getMatchStart() ||
690aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchlength != strsrch.getMatchLength()) {
691aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + search.text);
692aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Searching forward for pattern: " + strsrch.getPattern());
693aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Expected offset,len " + matchindex + ", " + matchlength + "; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
694aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return false;
695aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
696aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count ++;
697aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
698aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchtext = strsrch.getMatchedText();
699aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String targetText = search.text;
700aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchlength > 0 &&
701aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetText.substring(matchindex, matchindex + matchlength).compareTo(matchtext) != 0) {
702aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting following matched text");
703aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
704aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
705aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchindex = search.offset[count];
706aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
707aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.next();
708aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getMatchStart() != SearchIterator.DONE ||
709aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getMatchLength() != 0) {
710aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + search.text);
711aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Searching forward for pattern: " + strsrch.getPattern());
712aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Expected DONE offset,len -1, 0; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
713aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return false;
714aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
715aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // start of preceding matches
716aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        count = count == 0 ? 0 : count - 1;
717aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchindex = search.offset[count];
718aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchindex >= 0) {
719aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int matchlength = search.size[count];
720aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.previous();
721aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchindex != strsrch.getMatchStart() ||
722aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchlength != strsrch.getMatchLength()) {
723aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + search.text);
724aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Searching backward for pattern: " + strsrch.getPattern());
725aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Expected offset,len " + matchindex + ", " + matchlength + "; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
726aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return false;
727aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
728aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
729aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchtext = strsrch.getMatchedText();
730aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String targetText = search.text;
731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchlength > 0 &&
732aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetText.substring(matchindex, matchindex + matchlength).compareTo(matchtext) != 0) {
733aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting following matched text");
734aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
735aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
736aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchindex = count > 0 ? search.offset[count - 1] : -1;
737aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count --;
738aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
739aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.previous();
740aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getMatchStart() != SearchIterator.DONE ||
741aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getMatchLength() != 0) {
742aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + search.text);
743aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Searching backward for pattern: " + strsrch.getPattern());
744aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Expected DONE offset,len -1, 0; got " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
745aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return false;
746aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
747aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return true;
748aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
749aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
750f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
751aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestConstructor()
752aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
753aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "pattern";
754aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "text";
755aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringCharacterIterator textiter = new StringCharacterIterator(text);
756aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Collator defaultcollator = Collator.getInstance();
757aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BreakIterator breaker = BreakIterator.getCharacterInstance();
758aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        breaker.setText(text);
759aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch search = new StringSearch(pattern, text);
760aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!search.getPattern().equals(pattern)
761aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getTarget().equals(textiter)
762aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getCollator().equals(defaultcollator)
763aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /*|| !search.getBreakIterator().equals(breaker)*/) {
764aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("StringSearch(String, String) error");
765aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
766aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        search = new StringSearch(pattern, textiter, m_fr_fr_);
767aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!search.getPattern().equals(pattern)
768aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getTarget().equals(textiter)
769aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getCollator().equals(m_fr_fr_)
770aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /*|| !search.getBreakIterator().equals(breaker)*/) {
771aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("StringSearch(String, StringCharacterIterator, "
772aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  + "RuleBasedCollator) error");
773aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
774aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Locale de = new Locale("de", "DE");
775aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        breaker = BreakIterator.getCharacterInstance(de);
776aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        breaker.setText(text);
777aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        search = new StringSearch(pattern, textiter, de);
778aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!search.getPattern().equals(pattern)
779aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getTarget().equals(textiter)
780aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getCollator().equals(Collator.getInstance(de))
781aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /*|| !search.getBreakIterator().equals(breaker)*/) {
782aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("StringSearch(String, StringCharacterIterator, Locale) "
783aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  + "error");
784aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
785aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
786aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        search = new StringSearch(pattern, textiter, m_fr_fr_,
787aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                  m_en_wordbreaker_);
788aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!search.getPattern().equals(pattern)
789aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getTarget().equals(textiter)
790aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getCollator().equals(m_fr_fr_)
791aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            || !search.getBreakIterator().equals(m_en_wordbreaker_)) {
792aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("StringSearch(String, StringCharacterIterator, Locale) "
793aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  + "error");
794aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
795aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
796aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
797f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
798aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestBasic() {
799aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < BASIC.length; count++) {
800aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(BASIC[count])) {
801aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
802aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
803aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
804aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
805aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
806f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
807aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestBreakIterator() {
808aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
809aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = BREAKITERATOREXACT[0].text;
810aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = BREAKITERATOREXACT[0].pattern;
811aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
812aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
813aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
814aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
815aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search");
816aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
817aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
818aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
819aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setBreakIterator(null);
820aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getBreakIterator() != null) {
821aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error usearch_getBreakIterator returned wrong object");
822aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
823aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
824aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setBreakIterator(m_en_characterbreaker_);
825aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getBreakIterator().equals(m_en_characterbreaker_)) {
826aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error usearch_getBreakIterator returned wrong object");
827aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
828aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
829aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setBreakIterator(m_en_wordbreaker_);
830aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getBreakIterator().equals(m_en_wordbreaker_)) {
831aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error usearch_getBreakIterator returned wrong object");
832aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
833aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
834aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count = 0;
835aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (count < 4) {
836aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // special purposes for tests numbers 0-3
837aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData        search   = BREAKITERATOREXACT[count];
838aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedCollator collator = getCollator(search.collator);
839aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            BreakIterator     breaker  = getBreakIterator(search.breaker);
840aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  //StringSearch      strsrch;
841aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
842aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = search.text;
843aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = search.pattern;
844aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (breaker != null) {
845aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                breaker.setText(text);
846aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
847aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(search.strength);
848aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, breaker);
849aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.getBreakIterator() != breaker) {
850aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting break iterator");
851aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
852aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
853aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                collator.setStrength(TERTIARY);
854aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
855aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            search   = BREAKITERATOREXACT[count + 1];
856aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker  = getBreakIterator(search.breaker);
857aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (breaker != null) {
858aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                breaker.setText(text);
859aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
860aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setBreakIterator(breaker);
861aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.getBreakIterator() != breaker) {
862aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting break iterator");
863aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
864aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
865aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
866aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                 errln("Error at test number " + count);
867aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
868aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count += 2;
869aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
870aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < BREAKITERATOREXACT.length; count++) {
871aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(BREAKITERATOREXACT[count])) {
872aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
873aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
874aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
875aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
876aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
877f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
878aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestBreakIteratorCanonical() {
879aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int        count  = 0;
880aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (count < 4) {
881aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // special purposes for tests numbers 0-3
882aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData     search   = BREAKITERATORCANONICAL[count];
883aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
884aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String text = search.text;
885aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String pattern = search.pattern;
886aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedCollator collator = getCollator(search.collator);
887aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(search.strength);
888aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
889aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            BreakIterator breaker = getBreakIterator(search.breaker);
890aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringSearch  strsrch = null;
891aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
892aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, breaker);
893aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
894aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error creating string search data");
895aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
896aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
897aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
898aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!strsrch.getBreakIterator().equals(breaker)) {
899aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting break iterator");
900aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
901aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
902aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
903aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                collator.setStrength(TERTIARY);
904aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
905aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
906aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            search  = BREAKITERATOREXACT[count + 1];
907aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker = getBreakIterator(search.breaker);
908aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            breaker.setText(strsrch.getTarget());
909aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setBreakIterator(breaker);
910aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!strsrch.getBreakIterator().equals(breaker)) {
911aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting break iterator");
912aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
913aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
914aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
915aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
916aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
917aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                 errln("Error at test number " + count);
918aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                 return;
919aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
920aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count += 2;
921aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
922aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
923aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < BREAKITERATORCANONICAL.length; count++) {
924aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin             if (!assertEqual(BREAKITERATORCANONICAL[count])) {
925aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                 errln("Error at test number " + count);
926aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                 return;
927aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin             }
928aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
929aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
930aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
931f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
932aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCanonical() {
933aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < BASICCANONICAL.length; count++) {
934aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(BASICCANONICAL[count])) {
935aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
936aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
937aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
938aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
939aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
940f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
941aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCollator() {
942aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        // test collator that thinks "o" and "p" are the same thing
943aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = COLLATOR[0].text;
944aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern  = COLLATOR[0].pattern;
945aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
946aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
947aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
948aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
949aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
950aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
951aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
952aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATOR[0])) {
953aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
954aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
955aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = TESTCOLLATORRULE;
956aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator tailored = null;
957aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
958aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            tailored = new RuleBasedCollator(rules);
959aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            tailored.setStrength(COLLATOR[1].strength);
960aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
961aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening rule based collator ");
962aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
963aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
964aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
965aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCollator(tailored);
966aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getCollator().equals(tailored)) {
967aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting rule based collator");
968aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
969aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
970aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATOR[1])) {
971aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
972aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
973aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCollator(m_en_us_);
974aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
975aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getCollator().equals(m_en_us_)) {
976aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting rule based collator");
977aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
978aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATOR[0])) {
979aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin           errln("Error searching collator test");
980aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
981aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
982aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
983f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
984aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCollatorCanonical() {
985aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* test collator that thinks "o" and "p" are the same thing */
986aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = COLLATORCANONICAL[0].text;
987aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = COLLATORCANONICAL[0].pattern;
988aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
989aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
990aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
991aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
992aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
993aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
994aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
995aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
996aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
997aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[0])) {
998aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
999aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1000aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1001aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = TESTCOLLATORRULE;
1002aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator tailored = null;
1003aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1004aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            tailored = new RuleBasedCollator(rules);
1005aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            tailored.setStrength(COLLATORCANONICAL[1].strength);
1006aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            tailored.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1007aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1008aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening rule based collator ");
1009aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1010aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1011aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCollator(tailored);
1012aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getCollator().equals(tailored)) {
1013aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting rule based collator");
1014aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1015aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1016aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1017aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[1])) {
1018aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("COLLATORCANONICAL[1] failed");  // Error should already be reported.
1019aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1020aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCollator(m_en_us_);
1021aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1022aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.getCollator().equals(m_en_us_)) {
1023aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting rule based collator");
1024aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1025aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, COLLATORCANONICAL[0])) {
1026aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("COLLATORCANONICAL[0] failed");  // Error should already be reported.
1027aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1028aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1029aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1030f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1031aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCompositeBoundaries() {
1032aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < COMPOSITEBOUNDARIES.length; count++) {
1033aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // logln("composite " + count);
1034aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
1035aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1036aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1037aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1038aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1039aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1040f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1041aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestCompositeBoundariesCanonical() {
1042aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < COMPOSITEBOUNDARIESCANONICAL.length; count++) {
1043aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // logln("composite " + count);
1044aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
1045aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1046aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1047aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1048aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1049aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1050f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1051aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestContraction() {
1052aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = CONTRACTIONRULE;
1053aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator collator = null;
1054aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1055aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator = new RuleBasedCollator(rules);
1056aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(TERTIARY);
1057aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1058aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1059aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening collator ");
1060aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1061aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "text";
1062aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "pattern";
1063aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
1064aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1065aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
1066aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1067aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
1068aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1069aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1070aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count< CONTRACTION.length; count++) {
1071aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = CONTRACTION[count].text;
1072aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = CONTRACTION[count].pattern;
1073aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
1074aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1075aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, CONTRACTION[count])) {
1076aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1077aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1078aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1079aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1080aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1081f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1082aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestContractionCanonical() {
1083aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = CONTRACTIONRULE;
1084aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator collator = null;
1085aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1086aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator = new RuleBasedCollator(rules);
1087aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(TERTIARY);
1088aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1089aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1090aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening collator ");
1091aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1092aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "text";
1093aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "pattern";
1094aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
1095aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1096aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
1097aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
1098aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1099aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search");
1100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < CONTRACTIONCANONICAL.length; count++) {
1103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = CONTRACTIONCANONICAL[count].text;
1104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = CONTRACTIONCANONICAL[count].pattern;
1105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
1106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, CONTRACTIONCANONICAL[count])) {
1108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1113f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetMatch() {
1115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SearchData search = MATCH[0];
1116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = search.text;
1117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = search.pattern;
1118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
1120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
1124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int           count      = 0;
1128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int   matchindex = search.offset[count];
1129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String matchtext;
1130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        while (matchindex >= 0) {
1131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int matchlength = search.size[count];
1132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.next();
1133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchindex != strsrch.getMatchStart() ||
1134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchlength != strsrch.getMatchLength()) {
1135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + search.text);
1136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Pattern: " + strsrch.getPattern());
1137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
1138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            count++;
1141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchtext = strsrch.getMatchedText();
1143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (matchtext.length() != matchlength){
1144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting match text");
1145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            matchindex = search.offset[count];
1147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.next();
1149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getMatchStart()  != StringSearch.DONE ||
1150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getMatchLength() != 0) {
1151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error end of match not found");
1152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        matchtext = strsrch.getMatchedText();
1154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (matchtext != null) {
1155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error getting null matches");
1156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1159f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetSetAttribute() {
1161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = "pattern";
1162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  text = "text";
1163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch = null;
1164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening search");
1168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.isOverlapping()) {
1172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error default overlaping should be false");
1173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setOverlapping(true);
1175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.isOverlapping()) {
1176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting overlap true");
1177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setOverlapping(false);
1179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.isOverlapping()) {
1180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting overlap false");
1181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!strsrch.isCanonical()) {
1185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting canonical match true");
1186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(false);
1188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.isCanonical()) {
1189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting canonical match false");
1190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getElementComparisonType() != STANDARD_ELEMENT_COMPARISON) {
1193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error default element comparison type should be STANDARD_ELEMENT_COMPARISON");
1194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setElementComparisonType(ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD);
1196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getElementComparisonType() != ElementComparisonType.PATTERN_BASE_WEIGHT_IS_WILDCARD) {
1197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting element comparison type PATTERN_BASE_WEIGHT_IS_WILDCARD");
1198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1201f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetSetOffset() {
1203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = "1234567890123456";
1204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  text  = "12345678901234567890123456789012";
1205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch = null;
1206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening search");
1210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* testing out of bounds error */
1215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setIndex(-1);
1217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error expecting set offset error");
1218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IndexOutOfBoundsException e) {
1219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: strsrch.setIndex(-1) failed as expected");
1220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setIndex(128);
1224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error expecting set offset error");
1225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IndexOutOfBoundsException e) {
1226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: strsrch.setIndex(128) failed as expected");
1227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int index = 0; index < BASIC.length; index++) {
1230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData  search      = BASIC[index];
1231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text =search.text;
1233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = search.pattern;
1234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
1235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getCollator().setStrength(search.strength);
1237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
1238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int count = 0;
1240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int matchindex  = search.offset[count];
1241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            while (matchindex >= 0) {
1243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int matchlength = search.size[count];
1244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch.next();
1245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (matchindex != strsrch.getMatchStart() ||
1246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    matchlength != strsrch.getMatchLength()) {
1247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Text: " + text);
1248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Pattern: " + strsrch.getPattern());
1249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
1250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return;
1251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchindex = search.offset[count + 1] == -1 ? -1 :
1253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                             search.offset[count + 2];
1254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (search.offset[count + 1] != -1) {
1255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    strsrch.setIndex(search.offset[count + 1] + 1);
1256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (strsrch.getIndex() != search.offset[count + 1] + 1) {
1257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error setting offset\n");
1258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        return;
1259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                count += 2;
1263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.next();
1265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.getMatchStart() != StringSearch.DONE) {
1266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + text);
1267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Pattern: " + strsrch.getPattern());
1268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
1269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.getCollator().setStrength(TERTIARY);
1273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1275f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestGetSetOffsetCanonical() {
1277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  text = "text";
1279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern = "pattern";
1280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch = null;
1281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Fail to open StringSearch!");
1285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //TODO: setCanonical is not sufficient for canonical match. See #10725
1289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.getCollator().setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* testing out of bounds error */
1291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setIndex(-1);
1293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error expecting set offset error");
1294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IndexOutOfBoundsException e) {
1295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: strsrch.setIndex(-1) failed as expected");
1296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setIndex(128);
1299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error expecting set offset error");
1300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IndexOutOfBoundsException e) {
1301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: strsrch.setIndex(128) failed as expected");
1302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int index = 0; index < BASICCANONICAL.length; index++) {
1305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData  search      = BASICCANONICAL[index];
1306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = search.text;
1307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = search.pattern;
1308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
1309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int         count       = 0;
1311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int matchindex  = search.offset[count];
1312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            while (matchindex >= 0) {
1313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int matchlength = search.size[count];
1314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch.next();
1315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (matchindex != strsrch.getMatchStart() ||
1316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    matchlength != strsrch.getMatchLength()) {
1317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Text: " + text);
1318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Pattern: " + strsrch.getPattern());
1319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
1320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return;
1321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                matchindex = search.offset[count + 1] == -1 ? -1 :
1323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                             search.offset[count + 2];
1324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (search.offset[count + 1] != -1) {
1325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    strsrch.setIndex(search.offset[count + 1] + 1);
1326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (strsrch.getIndex() != search.offset[count + 1] + 1) {
1327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error setting offset");
1328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        return;
1329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                count += 2;
1333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.next();
1335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.getMatchStart() != StringSearch.DONE) {
1336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Text: " + text);
1337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Pattern: %s" + strsrch.getPattern());
1338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error match found at " + strsrch.getMatchStart() + ", " + strsrch.getMatchLength());
1339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.getCollator().setStrength(TERTIARY);
1343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.getCollator().setDecomposition(Collator.NO_DECOMPOSITION);
1344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1346f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestIgnorable() {
1348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String rules = IGNORABLERULE;
1349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int        count  = 0;
1350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        RuleBasedCollator collator = null;
1351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator = new RuleBasedCollator(rules);
1353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setStrength(IGNORABLE[count].strength);
1354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening collator ");
1357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "pattern";
1360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "text";
1361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
1362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
1364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
1366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (; count < IGNORABLE.length; count++) {
1370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = IGNORABLE[count].text;
1371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = IGNORABLE[count].pattern;
1372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
1373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, IGNORABLE[count])) {
1375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1380f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestInitialization() {
1382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  pattern;
1383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  text;
1384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String  temp = "a";
1385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  result;
1386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* simple test on the pattern ce construction */
1388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        pattern = temp + temp;
1389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        text = temp + temp + temp;
1390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening search ");
1394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* testing if an extremely large pattern will fail the initialization */
1398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        pattern = "";
1399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < 512; count ++) {
1400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern += temp;
1401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("pattern:" + result.getPattern());
1405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Fail: an extremely large pattern will fail the initialization");
1407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1411f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestNormCanonical() {
1413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < NORMCANONICAL.length; count++) {
1415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(NORMCANONICAL[count])) {
1416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setDecomposition(Collator.NO_DECOMPOSITION);
1420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1422f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestNormExact() {
1424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count;
1425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
1427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < BASIC.length; count++) {
1428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(BASIC[count])) {
1429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < NORMEXACT.length; count++) {
1433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(NORMEXACT[count])) {
1434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setDecomposition(Collator.NO_DECOMPOSITION);
1438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < NONNORMEXACT.length; count++) {
1439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(NONNORMEXACT[count])) {
1440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1445f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestOpenClose() {
1447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch            result;
1448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BreakIterator           breakiter = m_en_wordbreaker_;
1449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String           pattern = "";
1450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String           text = "";
1451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String           temp  = "a";
1452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringCharacterIterator  chariter= new StringCharacterIterator(text);
1453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* testing null arguments */
1455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
1457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null arguments should produce an error");
1458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: null arguments failed as expected");
1460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chariter.setText(text);
1463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, null, null);
1465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null arguments should produce an error");
1466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: null arguments failed as expected");
1468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        text  = String.valueOf(0x1);
1471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
1473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Empty pattern should produce an error");
1474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: Empty pattern failed as expected");
1476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chariter.setText(text);
1479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, null, null);
1481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Empty pattern should produce an error");
1482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: Empty pattern failed as expected");
1484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        text = "";
1487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        pattern =temp;
1488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
1490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Empty text should produce an error");
1491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: Empty text failed as expected");
1493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chariter.setText(text);
1496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, null, null);
1498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Empty text should produce an error");
1499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: Empty text failed as expected");
1501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        text += temp;
1504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), null, null);
1506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null arguments should produce an error");
1507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: null arguments failed as expected");
1509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chariter.setText(text);
1512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, null, null);
1514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null arguments should produce an error");
1515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("PASS: null arguments failed as expected");
1517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, null);
1521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null break iterator is valid for opening search");
1523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, m_en_us_, null);
1527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null break iterator is valid for opening search");
1529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), Locale.ENGLISH);
1533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null break iterator is valid for opening search");
1535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, Locale.ENGLISH);
1539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: null break iterator is valid for opening search");
1541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, new StringCharacterIterator(text), m_en_us_, breakiter);
1545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Break iterator is valid for opening search");
1547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
1550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result = new StringSearch(pattern, chariter, m_en_us_, null);
1551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            logln("pattern:" + result.getPattern());
1552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
1553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error: Break iterator is valid for opening search");
1554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1557f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1558aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestOverlap() {
1559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count;
1560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < OVERLAP.length; count++) {
1562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithAttribute(OVERLAP[count], false, true)) {
1563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at overlap test number " + count);
1564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1565aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < NONOVERLAP.length; count++) {
1568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(NONOVERLAP[count])) {
1569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at non overlap test number " + count);
1570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < OVERLAP.length && count < NONOVERLAP.length; count++) {
1574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData search = (OVERLAP[count]);
1575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String text = search.text;
1576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String pattern = search.pattern;
1577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedCollator collator = getCollator(search.collator);
1579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringSearch strsrch = null;
1580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
1581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch  = new StringSearch(pattern, new StringCharacterIterator(text), collator, null);
1582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
1583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("error open StringSearch");
1584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setOverlapping(true);
1588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!strsrch.isOverlapping()) {
1589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting overlap option");
1590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
1592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1594aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            search = NONOVERLAP[count];
1596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setOverlapping(false);
1597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.isOverlapping()) {
1598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting overlap option");
1599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
1601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
1602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin             }
1604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1607f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestOverlapCanonical() {
1609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count;
1610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < OVERLAPCANONICAL.length; count++) {
1612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], true, true)) {
1613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at overlap test number %d" + count);
1614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < NONOVERLAP.length; count++) {
1618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
1619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at non overlap test number %d" + count);
1620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (count = 0; count < OVERLAPCANONICAL.length && count < NONOVERLAPCANONICAL.length; count++) {
1624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData search = OVERLAPCANONICAL[count];
1625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedCollator collator = getCollator(search.collator);
1626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringSearch strsrch = new StringSearch(search.pattern, new StringCharacterIterator(search.text), collator, null);
1627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCanonical(true);
1628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setOverlapping(true);
1629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.isOverlapping() != true) {
1630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting overlap option");
1631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
1633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return;
1635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            search = NONOVERLAPCANONICAL[count];
1637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setOverlapping(false);
1638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.isOverlapping() != false) {
1639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error setting overlap option");
1640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
1642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, search)) {
1643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number %d" + count);
1645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin             }
1646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1649f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestPattern() {
1651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setStrength(PATTERN[0].strength);
1652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = new StringSearch(PATTERN[0].pattern, new StringCharacterIterator(PATTERN[0].text), m_en_us_, null);
1653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1654aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getPattern() != PATTERN[0].pattern) {
1655aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1656aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1657aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERN[0])) {
1658aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1659aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch != null) {
1660aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1661aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1662aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1663aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1664aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1665aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setPattern(PATTERN[1].pattern);
1666aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (PATTERN[1].pattern != strsrch.getPattern()) {
1667aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1668aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1669aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch != null) {
1670aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1671aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1672aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1673aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1674aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1675aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1676aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERN[1])) {
1677aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1678aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch != null) {
1679aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1680aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1681aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1682aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1683aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1684aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setPattern(PATTERN[0].pattern);
1685aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (PATTERN[0].pattern != strsrch.getPattern()) {
1686aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1687aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1688aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch != null) {
1689aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1690aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1691aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1692aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1693aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
1694aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1695aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERN[0])) {
1696aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1697aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch != null) {
1698aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                strsrch = null;
1699aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1700aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1701aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1702aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* enormous pattern size to see if this crashes */
1703aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "";
1704aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int templength = 0; templength != 512; templength ++) {
1705aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern += 0x61;
1706aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1707aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try{
1708aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
1709aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }catch(Exception e) {
1710aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern with size 512");
1711aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1712aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1713aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setStrength(TERTIARY);
1714aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch != null) {
1715aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1716aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1717aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1718aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1719f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1720aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestPatternCanonical() {
1721aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        //StringCharacterIterator text = new StringCharacterIterator(PATTERNCANONICAL[0].text);
1722aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setStrength(PATTERNCANONICAL[0].strength);
1723aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = new StringSearch(PATTERNCANONICAL[0].pattern, new StringCharacterIterator(PATTERNCANONICAL[0].text),
1724aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                m_en_us_, null);
1725aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1726aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1727aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (PATTERNCANONICAL[0].pattern != strsrch.getPattern()) {
1728aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1729aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1730aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[0])) {
1731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1732aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1733aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1734aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1735aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1736aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setPattern(PATTERNCANONICAL[1].pattern);
1737aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (PATTERNCANONICAL[1].pattern != strsrch.getPattern()) {
1738aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1739aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1740aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1741aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1742aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1743aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1744aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1745aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1746aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[1])) {
1747aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1748aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1749aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1750aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1751aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1752aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setPattern(PATTERNCANONICAL[0].pattern);
1753aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (PATTERNCANONICAL[0].pattern != strsrch.getPattern()) {
1754aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting pattern");
1755aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1756aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1757aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1758aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1759aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1760aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1761aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1762aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, PATTERNCANONICAL[0])) {
1763aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            m_en_us_.setStrength(TERTIARY);
1764aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1765aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1766aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1767aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1768aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1769f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1770aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestReset() {
1771aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringCharacterIterator text = new StringCharacterIterator("fish fish");
1772aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "s";
1773aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1774aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch  strsrch = new StringSearch(pattern, text, m_en_us_, null);
1775aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setOverlapping(true);
1776aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1777aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setIndex(9);
1778aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.reset();
1779aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.isCanonical() || strsrch.isOverlapping() ||
1780aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getIndex() != 0 || strsrch.getMatchLength() != 0 ||
1781aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getMatchStart() != SearchIterator.DONE) {
1782aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error resetting string search");
1783aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1784aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1785aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.previous();
1786aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (strsrch.getMatchStart() != 7 || strsrch.getMatchLength() != 1) {
1787aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error resetting string search\n");
1788aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1789aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1790aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1791f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1792aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSetMatch() {
1793aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < MATCH.length; count++) {
1794aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SearchData     search = MATCH[count];
1795aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringSearch strsrch = new StringSearch(search.pattern, new StringCharacterIterator(search.text),
1796aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                                    m_en_us_, null);
1797aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1798aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int size = 0;
1799aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            while (search.offset[size] != -1) {
1800aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                size ++;
1801aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1802aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1803aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.first() != search.offset[0]) {
1804aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting first match");
1805aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1806aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.last() != search.offset[size -1]) {
1807aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting last match");
1808aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1809aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1810aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            int index = 0;
1811aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            while (index < size) {
1812aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (index + 2 < size) {
1813aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (strsrch.following(search.offset[index + 2] - 1) != search.offset[index + 2]) {
1814aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error getting following match at index " + (search.offset[index + 2]-1));
1815aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1816aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1817aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (index + 1 < size) {
1818aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (strsrch.preceding(search.offset[index + 1] + search.size[index + 1] + 1) != search.offset[index + 1]) {
1819aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error getting preceeding match at index " + (search.offset[index + 1] + 1));
1820aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
1821aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1822aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                index += 2;
1823aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1824aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1825aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.following(search.text.length()) != SearchIterator.DONE) {
1826aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error expecting out of bounds match");
1827aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1828aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (strsrch.preceding(0) != SearchIterator.DONE) {
1829aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error expecting out of bounds match");
1830aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1831aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1832aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1833aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1834f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1835aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestStrength() {
1836aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < STRENGTH.length; count++) {
1837aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(STRENGTH[count])) {
1838aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1839aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1840aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1841aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1842aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1843f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1844aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestStrengthCanonical() {
1845aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < STRENGTHCANONICAL.length; count++) {
1846aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
1847aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number" + count);
1848aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1849aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1850aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1851aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1852f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1853aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSupplementary() {
1854aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < SUPPLEMENTARY.length; count++) {
1855aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(SUPPLEMENTARY[count])) {
1856aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1857aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1858aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1859aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1860aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1861f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1862aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSupplementaryCanonical() {
1863aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < SUPPLEMENTARYCANONICAL.length; count++) {
1864aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
1865aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number" + count);
1866aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1867aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1868aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1869aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1870f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1871aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestText() {
1872aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        SearchData TEXT[] = {
1873aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SD("the foxy brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(4, 15, -1), IA(3, 3)),
1874aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            SD("the quick brown fox", "fox", null, TERTIARY, STANDARD_ELEMENT_COMPARISON, null, IA(16, -1), IA(3))
1875aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
1876aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringCharacterIterator t = new StringCharacterIterator(TEXT[0].text);
1877aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = new StringSearch(TEXT[0].pattern, t, m_en_us_, null);
1878aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1879aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!t.equals(strsrch.getTarget())) {
1880aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting text");
1881aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1882aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, TEXT[0])) {
1883aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error at assertEqualWithStringSearch");
1884aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1885aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1886aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1887aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        t = new StringCharacterIterator(TEXT[1].text);
1888aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setTarget(t);
1889aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!t.equals(strsrch.getTarget())) {
1890aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting text");
1891aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1892aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1893aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1894aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, TEXT[1])) {
1895aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error at assertEqualWithStringSearch");
1896aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1897aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1898aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1899aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1900f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1901aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestTextCanonical() {
1902aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringCharacterIterator t = new StringCharacterIterator(TEXTCANONICAL[0].text);
1903aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = new StringSearch(TEXTCANONICAL[0].pattern, t, m_en_us_, null);
1904aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setCanonical(true);
1905aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1906aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!t.equals(strsrch.getTarget())) {
1907aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting text");
1908aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1909aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[0])) {
1910aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1911aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1912aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1913aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1914aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        t = new StringCharacterIterator(TEXTCANONICAL[1].text);
1915aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setTarget(t);
1916aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!t.equals(strsrch.getTarget())) {
1917aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting text");
1918aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1919aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1920aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1921aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1922aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[1])) {
1923aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1924aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1925aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1926aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1927aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        t = new StringCharacterIterator(TEXTCANONICAL[0].text);
1928aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        strsrch.setTarget(t);
1929aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!t.equals(strsrch.getTarget())) {
1930aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error setting text");
1931aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1932aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1933aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1934aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1935aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (!assertEqualWithStringSearch(strsrch, TEXTCANONICAL[0])) {
1936aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error at assertEqualWithStringSearch");
1937aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = null;
1938aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
1939aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1940aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1941aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1942f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1943aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestVariable() {
1944aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setAlternateHandlingShifted(true);
1945aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < VARIABLE.length; count++) {
1946aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // logln("variable" + count);
1947aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(VARIABLE[count])) {
1948aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1949aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1950aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1951aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setAlternateHandlingShifted(false);
1952aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1953aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1954f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1955aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestVariableCanonical() {
1956aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setAlternateHandlingShifted(true);
1957aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < VARIABLE.length; count++) {
1958aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            // logln("variable " + count);
1959aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertCanonicalEqual(VARIABLE[count])) {
1960aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
1961aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1962aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
1963aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        m_en_us_.setAlternateHandlingShifted(false);
1964aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
1965aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1966f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
1967aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestSubClass()
1968aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
1969aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class TestSearch extends SearchIterator
1970aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
1971aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String pattern;
1972aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String text;
1973aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
1974aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            TestSearch(StringCharacterIterator target, BreakIterator breaker,
1975aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                       String pattern)
1976aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {
1977aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                super(target, breaker);
1978aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                this.pattern = pattern;
1979aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                StringBuffer buffer = new StringBuffer();
1980aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                while (targetText.getIndex() != targetText.getEndIndex()) {
1981aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    buffer.append(targetText.current());
1982aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    targetText.next();
1983aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1984aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                text = buffer.toString();
1985aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetText.setIndex(targetText.getBeginIndex());
1986aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1987495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            @Override
1988aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            protected int handleNext(int start)
1989aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {
1990aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int match = text.indexOf(pattern, start);
1991aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (match < 0) {
1992aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    targetText.last();
1993aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return DONE;
1994aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
1995aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetText.setIndex(match);
1996aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                setMatchLength(pattern.length());
1997aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return match;
1998aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
1999495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            @Override
2000aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            protected int handlePrevious(int start)
2001aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {
2002aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int match = text.lastIndexOf(pattern, start - 1);
2003aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (match < 0) {
2004aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    targetText.setIndex(0);
2005aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return DONE;
2006aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2007aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                targetText.setIndex(match);
2008aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                setMatchLength(pattern.length());
2009aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return match;
2010aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2011aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2012495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            @Override
2013aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public int getIndex()
2014aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            {
2015aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int result = targetText.getIndex();
2016aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (result < 0 || result >= text.length()) {
2017aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    return DONE;
2018aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2019aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                return result;
2020aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2021aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2022aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2023aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        TestSearch search = new TestSearch(
2024aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            new StringCharacterIterator("abc abcd abc"),
2025aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            null, "abc");
2026aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int expected[] = {0, 4, 9};
2027aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < expected.length; i ++) {
2028aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (search.next() != expected[i]) {
2029aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting next match");
2030aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2031aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (search.getMatchLength() != search.pattern.length()) {
2032aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting next match length");
2033aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2034aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2035aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (search.next() != SearchIterator.DONE) {
2036aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error should have reached the end of the iteration");
2037aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2038aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = expected.length - 1; i >= 0; i --) {
2039aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (search.previous() != expected[i]) {
2040aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting next match");
2041aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2042aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (search.getMatchLength() != search.pattern.length()) {
2043aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error getting next match length");
2044aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2045aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2046aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (search.previous() != SearchIterator.DONE) {
2047aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error should have reached the start of the iteration");
2048aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2049aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
2050495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert
2051aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    //Test for ticket 5024
2052f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
2053aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestDiactricMatch() {
2054aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String pattern = "pattern";
2055aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String text = "text";
2056aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        StringSearch strsrch = null;
2057aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
2058aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch = new StringSearch(pattern, text);
2059aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
2060aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error opening string search ");
2061aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
2062aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2063aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2064aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < DIACTRICMATCH.length; count++) {
2065aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setCollator(getCollator(DIACTRICMATCH[count].collator));
2066aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.getCollator().setStrength(DIACTRICMATCH[count].strength);
2067aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setBreakIterator(getBreakIterator(DIACTRICMATCH[count].breaker));
2068aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.reset();
2069aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            text = DIACTRICMATCH[count].text;
2070aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            pattern = DIACTRICMATCH[count].pattern;
2071aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setTarget(new StringCharacterIterator(text));
2072aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            strsrch.setPattern(pattern);
2073aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqualWithStringSearch(strsrch, DIACTRICMATCH[count])) {
2074aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number " + count);
2075aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2076aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2077aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
2078aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2079f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
2080aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestUsingSearchCollator() {
2081aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoText =
2082aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            " " +
2083aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*01*/  "\uAC00 " +                   // simple LV Hangul
2084aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*03*/  "\uAC01 " +                   // simple LVT Hangul
2085aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*05*/  "\uAC0F " +                   // LVTT, last jamo expands for search
2086aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*07*/  "\uAFFF " +                   // LLVVVTT, every jamo expands for search
2087aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*09*/  "\u1100\u1161\u11A8 " +       // 0xAC01 as conjoining jamo
2088aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*13*/  "\u1100\u1161\u1100 " +       // 0xAC01 as basic conjoining jamo (per search rules)
2089aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*17*/  "\u3131\u314F\u3131 " +       // 0xAC01 as compatibility jamo
2090aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*21*/  "\u1100\u1161\u11B6 " +       // 0xAC0F as conjoining jamo; last expands for search
2091aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*25*/  "\u1100\u1161\u1105\u1112 " + // 0xAC0F as basic conjoining jamo; last expands for search
2092aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*30*/  "\u1101\u1170\u11B6 " +       // 0xAFFF as conjoining jamo; all expand for search
2093aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*34*/  "\u00E6 " +                   // small letter ae, expands
2094aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /*36*/  "\u1E4D " +                   // small letter o with tilde and acute, decomposes
2095aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            "";
2096aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2097aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat0 = "\uAC01";
2098aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat1 = "\u1100\u1161\u11A8"; // 0xAC01 as conjoining jamo
2099aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat2 = "\uAC0F";
2100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat3 = "\u1100\u1161\u1105\u1112"; // 0xAC0F as basic conjoining jamo
2101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat4 = "\uAFFF";
2102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String scKoPat5 = "\u1101\u1170\u11B6"; // 0xAFFF as conjoining jamo
2103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoSrchOff01 = { 3,  9, 13 };
2105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoSrchOff23 = { 5, 21, 25 };
2106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoSrchOff45 = { 7, 30     };
2107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoStndOff01 = { 3,  9 };
2109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoStndOff2  = { 5, 21 };
2110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoStndOff3  = { 25    };
2111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int[] scKoStndOff45 = { 7, 30 };
2112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class PatternAndOffsets {
2114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private String pattern;
2115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private int[] offsets;
2116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            PatternAndOffsets(String pat, int[] offs) {
2117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                pattern = pat;
2118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                offsets = offs;
2119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String getPattern() { return pattern; }
2121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public int[] getOffsets() { return offsets; }
2122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2123495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        final PatternAndOffsets[] scKoSrchPatternsOffsets = {
2124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat0, scKoSrchOff01 ),
2125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat1, scKoSrchOff01 ),
2126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat2, scKoSrchOff23 ),
2127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat3, scKoSrchOff23 ),
2128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat4, scKoSrchOff45 ),
2129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat5, scKoSrchOff45 ),
2130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
2131495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        final PatternAndOffsets[] scKoStndPatternsOffsets = {
2132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat0, scKoStndOff01 ),
2133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat1, scKoStndOff01 ),
2134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat2, scKoStndOff2  ),
2135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat3, scKoStndOff3  ),
2136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat4, scKoStndOff45 ),
2137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new PatternAndOffsets( scKoPat5, scKoStndOff45 ),
2138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
2139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        class TUSCItem {
2141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private String localeString;
2142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private String text;
2143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            private PatternAndOffsets[] patternsAndOffsets;
2144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            TUSCItem(String locStr, String txt, PatternAndOffsets[] patsAndOffs) {
2145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                localeString = locStr;
2146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                text = txt;
2147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                patternsAndOffsets = patsAndOffs;
2148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String getLocaleString() { return localeString; }
2150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public String getText() { return text; }
2151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            public PatternAndOffsets[] getPatternsAndOffsets() { return patternsAndOffsets; }
2152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2153495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        final TUSCItem[] tuscItems = {
2154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new TUSCItem( "root",                  scKoText, scKoStndPatternsOffsets ),
2155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new TUSCItem( "root@collation=search", scKoText, scKoSrchPatternsOffsets ),
2156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new TUSCItem( "ko@collation=search",   scKoText, scKoSrchPatternsOffsets ),
2157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        };
2158495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert
2159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String dummyPat = "a";
2160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (TUSCItem tuscItem: tuscItems) {
2162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String localeString = tuscItem.getLocaleString();
2163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ULocale uloc = new ULocale(localeString);
2164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            RuleBasedCollator col = null;
2165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
2166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                col = (RuleBasedCollator)Collator.getInstance(uloc);
2167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (Exception e) {
2168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error: in locale " + localeString + ", err in Collator.getInstance");
2169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                continue;
2170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringCharacterIterator ci = new StringCharacterIterator(tuscItem.getText());
2172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            StringSearch srch = new StringSearch(dummyPat, ci, col);
2173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for ( PatternAndOffsets patternAndOffsets: tuscItem.getPatternsAndOffsets() ) {
2174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                srch.setPattern(patternAndOffsets.getPattern());
2175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int[] offsets = patternAndOffsets.getOffsets();
2176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int ioff, noff = offsets.length;
2177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                int offset;
2178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                srch.reset();
2180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ioff = 0;
2181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                while (true) {
2182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    offset = srch.next();
2183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (offset == SearchIterator.DONE) {
2184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        break;
2185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
2186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if ( ioff < noff ) {
2187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if ( offset != offsets[ioff] ) {
2188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            errln("Error: in locale " + localeString + ", expected SearchIterator.next() " + offsets[ioff] + ", got " + offset);
2189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            //ioff = noff;
2190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            //break;
2191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
2192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        ioff++;
2193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } else {
2194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error: in locale " + localeString + ", SearchIterator.next() returned more matches than expected");
2195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
2196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if ( ioff < noff ) {
2198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Error: in locale " + localeString + ", SearchIterator.next() returned fewer matches than expected");
2199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                srch.reset();
2202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ioff = noff;
2203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                while (true) {
2204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    offset = srch.previous();
2205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if (offset == SearchIterator.DONE) {
2206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        break;
2207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
2208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    if ( ioff > 0 ) {
2209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        ioff--;
2210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if ( offset != offsets[ioff] ) {
2211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                             errln("Error: in locale " + localeString + ", expected SearchIterator.previous() " + offsets[ioff] + ", got " + offset);
2212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            //ioff = 0;
2213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            // break;
2214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
2215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } else {
2216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error: in locale " + localeString + ", expected SearchIterator.previous() returned more matches than expected");
2217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
2218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if ( ioff > 0 ) {
2220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Error: in locale " + localeString + ", expected SearchIterator.previous() returned fewer matches than expected");
2221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
2222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
2225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2226f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
2227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void TestIndicPrefixMatch() {
2228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int count = 0; count < INDICPREFIXMATCH.length; count++) {
2229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (!assertEqual(INDICPREFIXMATCH[count])) {
2230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error at test number" + count);
2231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
2232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
2233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
2234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
2236495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    // Test case for ticket#12555
2237495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    @Test
2238495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    public void TestLongPattern() {
2239495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        StringBuilder pattern = new StringBuilder();
2240495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        for (int i = 0; i < 255; i++) {
2241495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            pattern.append('a');
2242495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        }
2243495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        // appends a character producing multiple ce32 at
2244495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        // index 256.
2245495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        pattern.append('á');
2246495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert
2247495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        CharacterIterator target = new StringCharacterIterator("not important");
2248495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        try {
2249495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            StringSearch ss = new StringSearch(pattern.toString(), target, Locale.ENGLISH);
2250495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            assertNotNull("Non-null StringSearch instance", ss);
2251495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        } catch (Exception e) {
2252495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert            errln("Error initializing a new StringSearch object");
2253495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert        }
2254495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert    }
2255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
2256