blob: aecc220f0b62d29b66782d1f5cf64cd464a9c1be [file] [log] [blame]
using Lucene.Net.Attributes;
using Lucene.Net.Util;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;
namespace Lucene.Net.Search.Suggest
{
/*
* 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.
*/
public class FileDictionaryTest : LuceneTestCase
{
private KeyValuePair<List<string>, string> GenerateFileEntry(string fieldDelimiter, bool hasWeight, bool hasPayload)
{
List<string> entryValues = new List<string>();
StringBuilder sb = new StringBuilder();
string term = TestUtil.RandomSimpleString(Random, 1, 300);
sb.Append(term);
entryValues.Add(term);
if (hasWeight)
{
sb.Append(fieldDelimiter);
long weight = TestUtil.NextInt64(Random, long.MinValue, long.MaxValue);
// LUCENENET: We need to explicitly use invariant culture here,
// as that is what is expected in Java
sb.Append(weight.ToString(CultureInfo.InvariantCulture));
entryValues.Add(weight.ToString(CultureInfo.InvariantCulture));
}
if (hasPayload)
{
sb.Append(fieldDelimiter);
string payload = TestUtil.RandomSimpleString(Random, 1, 300);
sb.Append(payload);
entryValues.Add(payload);
}
sb.append("\n");
return new KeyValuePair<List<string>, string>(entryValues, sb.ToString());
}
private KeyValuePair<List<List<string>>, string> generateFileInput(int count, string fieldDelimiter, bool hasWeights, bool hasPayloads)
{
List<List<string>> entries = new List<List<string>>();
StringBuilder sb = new StringBuilder();
bool hasPayload = hasPayloads;
for (int i = 0; i < count; i++)
{
if (hasPayloads)
{
hasPayload = (i == 0) ? true : Random.nextBoolean();
}
KeyValuePair<List<string>, string> entrySet = GenerateFileEntry(fieldDelimiter, (!hasPayloads && hasWeights) ? Random.nextBoolean() : hasWeights, hasPayload);
entries.Add(entrySet.Key);
sb.Append(entrySet.Value);
}
return new KeyValuePair<List<List<string>>, string>(entries, sb.ToString());
}
[Test]
public void TestFileWithTerm()
{
KeyValuePair<List<List<string>>, string> fileInput = generateFileInput(AtLeast(100), FileDictionary.DEFAULT_FIELD_DELIMITER, false, false);
Stream inputReader = new MemoryStream(fileInput.Value.getBytes(Encoding.UTF8));
FileDictionary dictionary = new FileDictionary(inputReader);
List<List<string>> entries = fileInput.Key;
IInputEnumerator inputIter = dictionary.GetEntryEnumerator();
assertFalse(inputIter.HasPayloads);
int count = 0;
while (inputIter.MoveNext())
{
assertTrue(entries.size() > count);
List<string> entry = entries[count];
assertTrue(entry.size() >= 1); // at least a term
assertEquals(entry[0], inputIter.Current.Utf8ToString());
assertEquals(1, inputIter.Weight);
assertNull(inputIter.Payload);
count++;
}
assertEquals(count, entries.size());
}
[Test]
public void TestFileWithWeight()
{
KeyValuePair<List<List<string>>, string> fileInput = generateFileInput(AtLeast(100), FileDictionary.DEFAULT_FIELD_DELIMITER, true, false);
Stream inputReader = new MemoryStream(fileInput.Value.getBytes(Encoding.UTF8));
FileDictionary dictionary = new FileDictionary(inputReader);
List<List<String>> entries = fileInput.Key;
IInputEnumerator inputIter = dictionary.GetEntryEnumerator();
assertFalse(inputIter.HasPayloads);
int count = 0;
while (inputIter.MoveNext())
{
assertTrue(entries.size() > count);
List<String> entry = entries[count];
assertTrue(entry.size() >= 1); // at least a term
assertEquals(entry[0], inputIter.Current.Utf8ToString());
assertEquals((entry.size() == 2) ? long.Parse(entry[1], CultureInfo.InvariantCulture) : 1, inputIter.Weight);
assertNull(inputIter.Payload);
count++;
}
assertEquals(count, entries.size());
}
[Test]
public void TestFileWithWeightAndPayload()
{
KeyValuePair<List<List<string>>, string> fileInput = generateFileInput(AtLeast(100), FileDictionary.DEFAULT_FIELD_DELIMITER, true, true);
Stream inputReader = new MemoryStream(fileInput.Value.getBytes(Encoding.UTF8));
FileDictionary dictionary = new FileDictionary(inputReader);
List<List<string>> entries = fileInput.Key;
IInputEnumerator inputIter = dictionary.GetEntryEnumerator();
assertTrue(inputIter.HasPayloads);
int count = 0;
while (inputIter.MoveNext())
{
assertTrue(entries.size() > count);
List<string> entry = entries[count];
assertTrue(entry.size() >= 2); // at least term and weight
assertEquals(entry[0], inputIter.Current.Utf8ToString());
assertEquals(long.Parse(entry[1], CultureInfo.InvariantCulture), inputIter.Weight);
if (entry.size() == 3)
{
assertEquals(entry[2], inputIter.Payload.Utf8ToString());
}
else
{
assertEquals(inputIter.Payload.Length, 0);
}
count++;
}
assertEquals(count, entries.size());
}
[Test]
public void TestFileWithOneEntry()
{
KeyValuePair<List<List<string>>, string> fileInput = generateFileInput(1, FileDictionary.DEFAULT_FIELD_DELIMITER, true, true);
Stream inputReader = new MemoryStream(fileInput.Value.getBytes(Encoding.UTF8));
FileDictionary dictionary = new FileDictionary(inputReader);
List<List<string>> entries = fileInput.Key;
IInputEnumerator inputIter = dictionary.GetEntryEnumerator();
assertTrue(inputIter.HasPayloads);
int count = 0;
while (inputIter.MoveNext())
{
assertTrue(entries.size() > count);
List<string> entry = entries[count];
assertTrue(entry.size() >= 2); // at least term and weight
assertEquals(entry[0], inputIter.Current.Utf8ToString());
assertEquals(long.Parse(entry[1], CultureInfo.InvariantCulture), inputIter.Weight);
if (entry.size() == 3)
{
assertEquals(entry[2], inputIter.Payload.Utf8ToString());
}
else
{
assertEquals(inputIter.Payload.Length, 0);
}
count++;
}
assertEquals(count, entries.size());
}
[Test]
public void TestFileWithDifferentDelimiter()
{
KeyValuePair<List<List<string>>, string> fileInput = generateFileInput(AtLeast(100), " , ", true, true);
Stream inputReader = new MemoryStream(fileInput.Value.getBytes(Encoding.UTF8));
FileDictionary dictionary = new FileDictionary(inputReader, " , ");
List<List<string>> entries = fileInput.Key;
IInputEnumerator inputIter = dictionary.GetEntryEnumerator();
assertTrue(inputIter.HasPayloads);
int count = 0;
while (inputIter.MoveNext())
{
assertTrue(entries.size() > count);
List<string> entry = entries[count];
assertTrue(entry.size() >= 2); // at least term and weight
assertEquals(entry[0], inputIter.Current.Utf8ToString());
assertEquals(long.Parse(entry[1], CultureInfo.InvariantCulture), inputIter.Weight);
if (entry.size() == 3)
{
assertEquals(entry[2], inputIter.Payload.Utf8ToString());
}
else
{
assertEquals(inputIter.Payload.Length, 0);
}
count++;
}
assertEquals(count, entries.size());
}
}
}