package scala.collection.immutable import org.junit.{Assert, Test} import org.junit.runner.RunWith import org.junit.runners.JUnit4 import scala.ref.WeakReference @RunWith(classOf[JUnit4]) class ListTest { /** * Test that empty iterator does not hold reference * to complete List */ @Test def testIteratorGC(): Unit = { var num = 0 var emptyIterators = Seq.empty[(Iterator[Int], WeakReference[List[Int]])] do { val list = List.fill(10000)(num) val ref = WeakReference(list) val i = list.iterator while (i.hasNext) i.next() emptyIterators = (i, ref) +: emptyIterators num+=1 } while (emptyIterators.forall(_._2.get.isDefined) && num<1000) // check something is result to protect from JIT optimizations for ((i, _) <- emptyIterators) { Assert.assertTrue(i.isEmpty) } // await gc up to ~5 seconds var forceLoops = 50 while (emptyIterators.forall(_._2.get.isDefined) && forceLoops>0) { System.gc() Thread.sleep(100) forceLoops -= 1 } // real assertion Assert.assertTrue(emptyIterators.exists(_._2.get.isEmpty)) } }