public virtual void TestNormsRefCounting()
{
Directory dir1 = new MockRAMDirectory();
TestIndexReaderReopen.CreateIndex(dir1, false);
IndexReader reader1 = IndexReader.Open(dir1, false);
IndexReader reader2C = (IndexReader) reader1.Clone();
SegmentReader segmentReader2C = SegmentReader.GetOnlySegmentReader(reader2C);
segmentReader2C.Norms("field1"); // load the norms for the field
Norm reader2CNorm = segmentReader2C.norms_ForNUnit["field1"];
Assert.IsTrue(reader2CNorm.BytesRef().RefCount() == 2, "reader2CNorm.bytesRef()=" + reader2CNorm.BytesRef());
IndexReader reader3C = (IndexReader) reader2C.Clone();
SegmentReader segmentReader3C = SegmentReader.GetOnlySegmentReader(reader3C);
Norm reader3CCNorm = segmentReader3C.norms_ForNUnit["field1"];
Assert.AreEqual(3, reader3CCNorm.BytesRef().RefCount());
// edit a norm and the refcount should be 1
IndexReader reader4C = (IndexReader) reader3C.Clone();
SegmentReader segmentReader4C = SegmentReader.GetOnlySegmentReader(reader4C);
Assert.AreEqual(4, reader3CCNorm.BytesRef().RefCount());
reader4C.SetNorm(5, "field1", 0.33f);
// generate a cannot update exception in reader1
Assert.Throws<LockObtainFailedException>(() => reader3C.SetNorm(1, "field1", 0.99f), "did not hit expected exception");
// norm values should be different
Assert.IsTrue(Similarity.DecodeNorm(segmentReader3C.Norms("field1")[5]) != Similarity.DecodeNorm(segmentReader4C.Norms("field1")[5]));
Norm reader4CCNorm = segmentReader4C.norms_ForNUnit["field1"];
Assert.AreEqual(3, reader3CCNorm.BytesRef().RefCount());
Assert.AreEqual(1, reader4CCNorm.BytesRef().RefCount());
IndexReader reader5C = (IndexReader) reader4C.Clone();
SegmentReader segmentReader5C = SegmentReader.GetOnlySegmentReader(reader5C);
Norm reader5CCNorm = segmentReader5C.norms_ForNUnit["field1"];
reader5C.SetNorm(5, "field1", 0.7f);
Assert.AreEqual(1, reader5CCNorm.BytesRef().RefCount());
reader5C.Close();
reader4C.Close();
reader3C.Close();
reader2C.Close();
reader1.Close();
dir1.Close();
}