/* * 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. */ using System; using NUnit.Framework; using Analyzer = Lucene.Net.Analysis.Analyzer; using SimpleAnalyzer = Lucene.Net.Analysis.SimpleAnalyzer; using Lucene.Net.Documents; using Directory = Lucene.Net.Store.Directory; using RAMDirectory = Lucene.Net.Store.RAMDirectory; using LuceneTestCase = Lucene.Net.Util.LuceneTestCase; namespace Lucene.Net.Index { /// Test demonstrating EOF bug on the last field of the last doc /// if other docs have allready been accessed. /// [TestFixture] public class TestLazyBug:LuceneTestCase { [Serializable] public class AnonymousClassFieldSelector : FieldSelector { public virtual FieldSelectorResult Accept(System.String f) { if (f.Equals(Lucene.Net.Index.TestLazyBug.MAGIC_FIELD)) { return FieldSelectorResult.LOAD; } return FieldSelectorResult.LAZY_LOAD; } } public static int NUM_DOCS = 500; public static int NUM_FIELDS = 100; private static System.String[] data = new System.String[]{"now", "is the time", "for all good men", "to come to the aid", "of their country!", "this string contains big chars:{\u0111 \u0222 \u0333 \u1111 \u2222 \u3333}", "this string is a bigger string, mary had a little lamb, little lamb, little lamb!"}; private static System.Collections.Hashtable dataset = new System.Collections.Hashtable(); private static System.String MAGIC_FIELD = "f" + (NUM_FIELDS / 3); private static FieldSelector SELECTOR; private Directory MakeIndex() { Directory dir = new RAMDirectory(); try { System.Random r = NewRandom(); Analyzer analyzer = new SimpleAnalyzer(); IndexWriter writer = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED); writer.UseCompoundFile = false; for (int d = 1; d <= NUM_DOCS; d++) { Document doc = new Document(); for (int f = 1; f <= NUM_FIELDS; f++) { doc.Add(new Field("f" + f, data[f % data.Length] + '#' + data[r.Next(data.Length)], Field.Store.YES, Field.Index.ANALYZED)); } writer.AddDocument(doc); } writer.Close(); } catch (System.Exception e) { throw new System.SystemException("", e); } return dir; } public virtual void DoTest(int[] docs) { if (dataset.Count == 0) for (int i = 0; i < data.Length; i++) dataset.Add(data[i], data[i]); Directory dir = MakeIndex(); IndexReader reader = IndexReader.Open(dir, true); for (int i = 0; i < docs.Length; i++) { Document d = reader.Document(docs[i], SELECTOR); d.Get(MAGIC_FIELD); var fields = d.GetFields(); for (System.Collections.IEnumerator fi = fields.GetEnumerator(); fi.MoveNext(); ) { IFieldable f = null; try { f = (IFieldable) fi.Current; System.String fname = f.Name; System.String fval = f.StringValue; Assert.IsNotNull(docs[i] + " FIELD: " + fname, fval); System.String[] vals = fval.Split('#'); Assert.IsTrue(dataset.Contains(vals[0]) || dataset.Contains(vals[1]), "FIELD:" + fname + ",VAL:" + fval); } catch (System.Exception e) { throw new Exception(docs[i] + " WTF: " + f.Name, e); } } } reader.Close(); } [Test] public virtual void TestLazyWorks() { DoTest(new int[]{399}); } [Test] public virtual void TestLazyAlsoWorks() { DoTest(new int[]{399, 150}); } [Test] public virtual void TestLazyBroken() { DoTest(new int[]{150, 399}); } static TestLazyBug() { SELECTOR = new AnonymousClassFieldSelector(); } } }