private void TestTermsOneThread(Fields fieldsSource, ISet<Option> options, FieldInfo.IndexOptions maxTestOptions, FieldInfo.IndexOptions maxIndexOptions, bool alwaysTestMax)
{
ThreadState threadState = new ThreadState();
// Test random terms/fields:
IList<TermState> termStates = new List<TermState>();
IList<FieldAndTerm> termStateTerms = new List<FieldAndTerm>();
AllTerms = CollectionsHelper.Shuffle(AllTerms);
int upto = 0;
while (upto < AllTerms.Count)
{
bool useTermState = termStates.Count != 0 && Random().Next(5) == 1;
FieldAndTerm fieldAndTerm;
TermsEnum termsEnum;
TermState termState = null;
if (!useTermState)
{
// Seek by random field+term:
fieldAndTerm = AllTerms[upto++];
if (VERBOSE)
{
Console.WriteLine("\nTEST: seek to term=" + fieldAndTerm.Field + ":" + fieldAndTerm.Term.Utf8ToString());
}
}
else
{
// Seek by previous saved TermState
int idx = Random().Next(termStates.Count);
fieldAndTerm = termStateTerms[idx];
if (VERBOSE)
{
Console.WriteLine("\nTEST: seek using TermState to term=" + fieldAndTerm.Field + ":" + fieldAndTerm.Term.Utf8ToString());
}
termState = termStates[idx];
}
Terms terms = fieldsSource.Terms(fieldAndTerm.Field);
Assert.IsNotNull(terms);
termsEnum = terms.Iterator(null);
if (!useTermState)
{
Assert.IsTrue(termsEnum.SeekExact(fieldAndTerm.Term));
}
else
{
termsEnum.SeekExact(fieldAndTerm.Term, termState);
}
bool savedTermState = false;
if (options.Contains(Option.TERM_STATE) && !useTermState && Random().Next(5) == 1)
{
// Save away this TermState:
termStates.Add(termsEnum.TermState());
termStateTerms.Add(fieldAndTerm);
savedTermState = true;
}
VerifyEnum(threadState, fieldAndTerm.Field, fieldAndTerm.Term, termsEnum, maxTestOptions, maxIndexOptions, options, alwaysTestMax);
// Sometimes save term state after pulling the enum:
if (options.Contains(Option.TERM_STATE) && !useTermState && !savedTermState && Random().Next(5) == 1)
{
// Save away this TermState:
termStates.Add(termsEnum.TermState());
termStateTerms.Add(fieldAndTerm);
useTermState = true;
}
// 10% of the time make sure you can pull another enum
// from the same term:
if (alwaysTestMax || Random().Next(10) == 7)
{
// Try same term again
if (VERBOSE)
{
Console.WriteLine("TEST: try enum again on same term");
}
VerifyEnum(threadState, fieldAndTerm.Field, fieldAndTerm.Term, termsEnum, maxTestOptions, maxIndexOptions, options, alwaysTestMax);
}
}
}