blob: 0f4e14af9a9603eaa46f83963543f0c4113d7e50 [file] [log] [blame]
using System;
using System.IO;
using Lucene.Net.Analysis.Util;
using Lucene.Net.Support;
using Lucene.Net.Util;
using NUnit.Framework;
namespace Lucene.Net.Analysis.Util
{
/*
* 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.
*/
/// <summary>
/// TestCase for the <seealso cref="CharacterUtils"/> class.
/// </summary>
[TestFixture]
public class TestCharacterUtils : LuceneTestCase
{
[Test]
public virtual void TestCodePointAtCharSequenceInt()
{
var java4 = CharacterUtils.GetInstance(LuceneVersion.LUCENE_30);
var cpAt3 = "Abc\ud801\udc1c";
var highSurrogateAt3 = "Abc\ud801";
assertEquals((int)'A', java4.CodePointAt(cpAt3, 0));
assertEquals((int)'\ud801', java4.CodePointAt(cpAt3, 3));
assertEquals((int)'\ud801', java4.CodePointAt(highSurrogateAt3, 3));
try
{
java4.CodePointAt(highSurrogateAt3, 4);
fail("string index out of bounds");
}
catch (IndexOutOfRangeException)
{
}
var java5 = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
assertEquals((int)'A', java5.CodePointAt(cpAt3, 0));
assertEquals(Character.CodePointAt('\ud801', '\udc1c'), java5.CodePointAt(cpAt3, 3));
assertEquals((int)'\ud801', java5.CodePointAt(highSurrogateAt3, 3));
try
{
java5.CodePointAt(highSurrogateAt3, 4);
fail("string index out of bounds");
}
catch (System.IndexOutOfRangeException)
{
}
}
[Test]
public virtual void TestCodePointAtCharArrayIntInt()
{
var java4 = CharacterUtils.GetInstance(LuceneVersion.LUCENE_30);
var cpAt3 = "Abc\ud801\udc1c".ToCharArray();
var highSurrogateAt3 = "Abc\ud801".ToCharArray();
assertEquals((int)'A', java4.CodePointAt(cpAt3, 0, 2));
assertEquals((int)'\ud801', java4.CodePointAt(cpAt3, 3, 5));
assertEquals((int)'\ud801', java4.CodePointAt(highSurrogateAt3, 3, 4));
var java5 = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
assertEquals((int)'A', java5.CodePointAt(cpAt3, 0, 2));
assertEquals(Character.ToCodePoint('\ud801', '\udc1c'), java5.CodePointAt(cpAt3, 3, 5));
assertEquals((int)'\ud801', java5.CodePointAt(highSurrogateAt3, 3, 4));
}
[Test]
public virtual void TestCodePointCount()
{
var java4 = CharacterUtils.Java4Instance;
var java5 = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
var s = TestUtil.RandomUnicodeString(Random());
assertEquals(s.Length, java4.CodePointCount(s));
assertEquals(Character.CodePointCount(s, 0, s.Length), java5.CodePointCount(s));
}
[Test]
public virtual void TestOffsetByCodePoint()
{
var java4 = CharacterUtils.Java4Instance;
var java5 = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
for (int i = 0; i < 10; ++i)
{
var s = TestUtil.RandomUnicodeString(Random()).toCharArray();
var index = TestUtil.NextInt(Random(), 0, s.Length);
var offset = Random().Next(7) - 3;
try
{
var to = java4.OffsetByCodePoints(s, 0, s.Length, index, offset);
assertEquals(to, index + offset);
}
catch (System.IndexOutOfRangeException)
{
assertTrue((index + offset) < 0 || (index + offset) > s.Length);
}
int o;
try
{
o = java5.OffsetByCodePoints(s, 0, s.Length, index, offset);
}
catch (System.IndexOutOfRangeException)
{
try
{
Character.OffsetByCodePoints(s, 0, s.Length, index, offset);
fail();
}
catch (System.IndexOutOfRangeException)
{
// OK
}
o = -1;
}
if (o >= 0)
{
assertEquals(Character.OffsetByCodePoints(s, 0, s.Length, index, offset), o);
}
}
}
[Test]
public virtual void TestConversions()
{
var java4 = CharacterUtils.Java4Instance;
var java5 = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
TestConversions(java4);
TestConversions(java5);
}
private void TestConversions(CharacterUtils charUtils)
{
var orig = TestUtil.RandomUnicodeString(Random(), 100).toCharArray();
var buf = new int[orig.Length];
var restored = new char[buf.Length];
var o1 = TestUtil.NextInt(Random(), 0, Math.Min(5, orig.Length));
var o2 = TestUtil.NextInt(Random(), 0, o1);
var o3 = TestUtil.NextInt(Random(), 0, o1);
var codePointCount = charUtils.toCodePoints(orig, o1, orig.Length - o1, buf, o2);
var charCount = charUtils.toChars(buf, o2, codePointCount, restored, o3);
assertEquals(orig.Length - o1, charCount);
assertArrayEquals(Arrays.CopyOfRange(orig, o1, o1 + charCount), Arrays.CopyOfRange(restored, o3, o3 + charCount));
}
[Test]
public virtual void TestNewCharacterBuffer()
{
var newCharacterBuffer = CharacterUtils.NewCharacterBuffer(1024);
assertEquals(1024, newCharacterBuffer.Buffer.Length);
assertEquals(0, newCharacterBuffer.Offset);
assertEquals(0, newCharacterBuffer.Length);
newCharacterBuffer = CharacterUtils.NewCharacterBuffer(2);
assertEquals(2, newCharacterBuffer.Buffer.Length);
assertEquals(0, newCharacterBuffer.Offset);
assertEquals(0, newCharacterBuffer.Length);
try
{
CharacterUtils.NewCharacterBuffer(1);
fail("length must be >= 2");
}
catch (System.ArgumentException)
{
}
}
[Test]
public virtual void TestFillNoHighSurrogate()
{
var versions = new LuceneVersion[] { LuceneVersion.LUCENE_30, TEST_VERSION_CURRENT };
foreach (var version in versions)
{
var instance = CharacterUtils.GetInstance(version);
var reader = new StringReader("helloworld");
var buffer = CharacterUtils.NewCharacterBuffer(6);
assertTrue(instance.Fill(buffer, reader));
assertEquals(0, buffer.Offset);
assertEquals(6, buffer.Length);
assertEquals("hellow", new string(buffer.Buffer));
assertFalse(instance.Fill(buffer, reader));
assertEquals(4, buffer.Length);
assertEquals(0, buffer.Offset);
assertEquals("orld", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertFalse(instance.Fill(buffer, reader));
}
}
[Test]
public virtual void TestFillJava15()
{
const string input = "1234\ud801\udc1c789123\ud801\ud801\udc1c\ud801";
var instance = CharacterUtils.GetInstance(TEST_VERSION_CURRENT);
var reader = new StringReader(input);
var buffer = CharacterUtils.NewCharacterBuffer(5);
assertTrue(instance.Fill(buffer, reader));
assertEquals(4, buffer.Length);
assertEquals("1234", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertTrue(instance.Fill(buffer, reader));
assertEquals(5, buffer.Length);
assertEquals("\ud801\udc1c789", new string(buffer.Buffer));
assertTrue(instance.Fill(buffer, reader));
assertEquals(4, buffer.Length);
assertEquals("123\ud801", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertFalse(instance.Fill(buffer, reader));
assertEquals(3, buffer.Length);
assertEquals("\ud801\udc1c\ud801", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertFalse(instance.Fill(buffer, reader));
assertEquals(0, buffer.Length);
}
[Test]
public virtual void TestFillJava14()
{
var input = "1234\ud801\udc1c789123\ud801\ud801\udc1c\ud801";
var instance = CharacterUtils.GetInstance(LuceneVersion.LUCENE_30);
var reader = new StringReader(input);
var buffer = CharacterUtils.NewCharacterBuffer(5);
assertTrue(instance.Fill(buffer, reader));
assertEquals(5, buffer.Length);
assertEquals("1234\ud801", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertTrue(instance.Fill(buffer, reader));
assertEquals(5, buffer.Length);
assertEquals("\udc1c7891", new string(buffer.Buffer));
buffer = CharacterUtils.NewCharacterBuffer(6);
assertTrue(instance.Fill(buffer, reader));
assertEquals(6, buffer.Length);
assertEquals("23\ud801\ud801\udc1c\ud801", new string(buffer.Buffer, buffer.Offset, buffer.Length));
assertFalse(instance.Fill(buffer, reader));
}
}
}