blob: 3224cf4d01716580b956a6a8badf88aea96e3b82 [file] [log] [blame]
#if FEATURE_COLLATION
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using Icu;
using Icu.Collation;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Core;
using Lucene.Net.Util;
using NUnit.Framework;
namespace Lucene.Net.Collation
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
[TestFixture]
[Obsolete("remove when CollationKeyFilter is removed.")]
public class TestCollationKeyFilter : CollationTestBase
{
public TestCollationKeyFilter()
{
InitializeInstanceFields();
}
private void InitializeInstanceFields()
{
this.analyzer = new TestAnalyzer(this, this.collator);
this.firstRangeBeginning = new BytesRef(this.EncodeCollationKey(this.collator.GetSortKey(this.FirstRangeBeginningOriginal).KeyData.ToSByteArray()));
this.firstRangeEnd = new BytesRef(this.EncodeCollationKey(this.collator.GetSortKey(this.FirstRangeEndOriginal).KeyData.ToSByteArray()));
this.secondRangeBeginning = new BytesRef(this.EncodeCollationKey(this.collator.GetSortKey(this.SecondRangeBeginningOriginal).KeyData.ToSByteArray()));
this.secondRangeEnd = new BytesRef(this.EncodeCollationKey(this.collator.GetSortKey(this.SecondRangeEndOriginal).KeyData.ToSByteArray()));
}
// the sort order of Ø versus U depends on the version of the rules being used
// for the inherited root locale: Ø's order isnt specified in Locale.US since
// its not used in english.
internal bool oStrokeFirst = Collator.Create(new CultureInfo("")).Compare("Ø", "U") < 0;
// Neither Java 1.4.2 nor 1.5.0 has Farsi Locale collation available in
// RuleBasedCollator. However, the Arabic Locale seems to order the Farsi
// characters properly.
private readonly Collator collator = Collator.Create(new CultureInfo("ar"));
private Analyzer analyzer;
private BytesRef firstRangeBeginning;
private BytesRef firstRangeEnd;
private BytesRef secondRangeBeginning;
private BytesRef secondRangeEnd;
public sealed class TestAnalyzer : Analyzer
{
private readonly TestCollationKeyFilter outerInstance;
internal Collator _collator;
internal TestAnalyzer(TestCollationKeyFilter outerInstance, Collator collator)
{
this.outerInstance = outerInstance;
this._collator = collator;
}
protected internal override TokenStreamComponents CreateComponents(String fieldName, TextReader reader)
{
Tokenizer result = new KeywordTokenizer(reader);
return new TokenStreamComponents(result, new CollationKeyFilter(result, this._collator));
}
}
[Test]
public virtual void TestFarsiRangeFilterCollating()
{
this.TestFarsiRangeFilterCollating(this.analyzer, this.firstRangeBeginning, this.firstRangeEnd, this.secondRangeBeginning, this.secondRangeEnd);
}
[Test]
public virtual void TestFarsiRangeQueryCollating()
{
this.TestFarsiRangeQueryCollating(this.analyzer, this.firstRangeBeginning, this.firstRangeEnd, this.secondRangeBeginning, this.secondRangeEnd);
}
[Test]
public virtual void TestFarsiTermRangeQuery()
{
this.TestFarsiTermRangeQuery(this.analyzer, this.firstRangeBeginning, this.firstRangeEnd, this.secondRangeBeginning, this.secondRangeEnd);
}
[Test]
public virtual void TestCollationKeySort()
{
Analyzer usAnalyzer = new TestAnalyzer(this, GetCollator("en-US"));
Collator franceCollator = GetCollator("fr");
franceCollator.FrenchCollation = FrenchCollation.On;
Analyzer franceAnalyzer = new TestAnalyzer(this, franceCollator);
// `useFallback: true` on both Swedish and Danish collators in
// case the region specific collator is not found.
Analyzer swedenAnalyzer = new TestAnalyzer(this, GetCollator("sv-SE", "sv"));
Analyzer denmarkAnalyzer = new TestAnalyzer(this, GetCollator("da-DK", "da"));
// The ICU Collator and Sun java.text.Collator implementations differ in their
// orderings - "BFJDH" is the ordering for java.text.Collator for Locale.US.
this.TestCollationKeySort(usAnalyzer, franceAnalyzer, swedenAnalyzer, denmarkAnalyzer,
this.oStrokeFirst ? "BFJHD" : "BFJDH", "EACGI", "BJDFH", "BJDHF");
}
private Collator GetCollator(params string[] localeNames)
{
var firstMatchingLocale = localeNames
.Select(x => new Locale(x))
.FirstOrDefault(x => availableCollationLocales.Contains(x.Id));
if (firstMatchingLocale == default(Locale))
{
throw new ArgumentException($"Could not find a collator locale matching any of the following: {string.Join(", ", localeNames)}");
}
Collator collator = RuleBasedCollator.Create(firstMatchingLocale.Id);
return collator;
}
// Original Java Code:
//public void testCollationKeySort() throws Exception {
// Analyzer usAnalyzer = new TestAnalyzer(Collator.getInstance(Locale.US));
// Analyzer franceAnalyzer
// = new TestAnalyzer(Collator.getInstance(Locale.FRANCE));
// Analyzer swedenAnalyzer
// = new TestAnalyzer(Collator.getInstance(new Locale("sv", "se")));
// Analyzer denmarkAnalyzer
// = new TestAnalyzer(Collator.getInstance(new Locale("da", "dk")));
// // The ICU Collator and Sun java.text.Collator implementations differ in their
// // orderings - "BFJDH" is the ordering for java.text.Collator for Locale.US.
// testCollationKeySort
// (usAnalyzer, franceAnalyzer, swedenAnalyzer, denmarkAnalyzer,
// oStrokeFirst ? "BFJHD" : "BFJDH", "EACGI", "BJDFH", "BJDHF");
//}
}
}
#endif