[RService] Enhance test for LazyRStore
diff --git a/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/services/util/dataaccess/LazyRStoreTest.java b/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/services/util/dataaccess/LazyRStoreTest.java
index bf0963a..14bea22 100644
--- a/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/services/util/dataaccess/LazyRStoreTest.java
+++ b/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/services/util/dataaccess/LazyRStoreTest.java
@@ -69,8 +69,6 @@
 	}
 	
 	
-	private AtomicReference<@Nullable String> prefix;
-	
 	private LazyRStore<TestElement> store;
 	
 	
@@ -80,184 +78,207 @@
 	
 	
 	@Test
-	public void get_directUpdate_Row() {
+	public void get_directUpdate_scrollRows() {
 		final long rowCount= 2000000;
 		final long colCount= 100000;
-		this.prefix= new AtomicReference<>("A");
-		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater());
+		final AtomicReference<@Nullable String> prefix= new AtomicReference<>();
+		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater(prefix));
 		final ProgressMonitor m= new NullProgressMonitor();
 		
+		prefix.set("A");
 		for (long colIdx= 0; colIdx < colCount; colIdx+= 33333) {
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long rowIdx= rowCount - 1; rowIdx >= 0; rowIdx-= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long rowIdx= rowCount - 1; rowIdx >= 0; rowIdx-= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 		}
 	}
 	
 	@Test
-	public void get_directUpdate_Col() {
+	public void get_directUpdate_scrollCols() {
 		final long rowCount= 100000;
 		final long colCount= 2000000;
-		this.prefix= new AtomicReference<>("A");
-		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater());
+		final AtomicReference<@Nullable String> prefix= new AtomicReference<>();
+		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater(prefix));
 		final ProgressMonitor m= new NullProgressMonitor();
 		
+		prefix.set("A");
 		for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 33333) {
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long colIdx= colCount - 1; colIdx >= 0; colIdx-= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long colIdx= colCount - 1; colIdx >= 0; colIdx-= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, "A", m);
 			}
 		}
 	}
 	
 	@Test
-	public void get_directUpdate_Random() {
+	public void get_directUpdate_random() {
 		final int rowCount= 2000000;
 		final int colCount= 2000000;
-		this.prefix= new AtomicReference<>("A");
-		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater());
+		final AtomicReference<@Nullable String> prefix= new AtomicReference<>();
+		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater(prefix));
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		final Random rand= new Random(RANDOM_SEED);
+		
+		prefix.set("A");
 		for (int i= 0; i < 100000; i++) {
-			assertFragment(rand.nextInt(rowCount), rand.nextInt(colCount), m);
+			assertFragment(rand.nextInt(rowCount), rand.nextInt(colCount), "A", m);
 		}
 	}
 	
 	@Test
-	public void get_directUpdate_RandomLong() {
+	public void get_directUpdate_randomLong() {
 		final long rowCount= 200000000000L;
 		final long colCount= 20000000000L;
-		this.prefix= new AtomicReference<>("A");
-		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater());
+		final AtomicReference<@Nullable String> prefix= new AtomicReference<>();
+		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater(prefix));
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		final Random rand= new Random(RANDOM_SEED);
 		final OfLong rows= rand.longs(0, rowCount).iterator();
 		final OfLong cols= rand.longs(0, colCount).iterator();
+		
+		prefix.set("A");
 		for (int i= 0; i < 100000; i++) {
-			assertFragment(rows.nextLong(), cols.nextLong(), m);
+			assertFragment(rows.nextLong(), cols.nextLong(), "A", m);
 		}
 	}
 	
 	@Test
-	public void get_noUpdate_Row() {
+	public void get_noUpdate_scrollRows() {
 		final long rowCount= 2000000;
 		final long colCount= 100000;
-		this.prefix= new AtomicReference<>();
 		this.store= new LazyRStore<>(rowCount, colCount, 10, noUpdater());
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		for (long colIdx= 0; colIdx < colCount; colIdx+= 33333) {
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long rowIdx= rowCount - 1; rowIdx >= 0; rowIdx-= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long rowIdx= rowCount - 1; rowIdx >= 0; rowIdx-= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 		}
 	}
 	
 	@Test
-	public void get_noUpdate_Col() {
+	public void get_noUpdate_scrollCols() {
 		final long rowCount= 100000;
 		final long colCount= 2000000;
-		this.prefix= new AtomicReference<>();
 		this.store= new LazyRStore<>(rowCount, colCount, 10, noUpdater());
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		for (long rowIdx= 0; rowIdx < rowCount; rowIdx+= 33333) {
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long colIdx= colCount - 1; colIdx >= 0; colIdx-= 20) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long colIdx= colCount - 1; colIdx >= 0; colIdx-= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 			for (long colIdx= 0; colIdx < colCount; colIdx+= 1000) {
-				assertFragment(rowIdx, colIdx, m);
+				assertFragment(rowIdx, colIdx, null, m);
 			}
 		}
 	}
 	
 	@Test
-	public void get_noUpdate_Random() {
+	public void get_noUpdate_random() {
 		final int rowCount= 2000000;
 		final int colCount= 2000000;
-		this.prefix= new AtomicReference<>();
 		this.store= new LazyRStore<>(rowCount, colCount, 10, noUpdater());
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		final Random rand= new Random(RANDOM_SEED);
+		
 		for (int i= 0; i < 100000; i++) {
-			assertFragment(rand.nextInt(rowCount), rand.nextInt(colCount), m);
+			assertFragment(rand.nextInt(rowCount), rand.nextInt(colCount), null, m);
 		}
 	}
 	
 	@Test
-	public void get_noUpdate_RandomLong() {
+	public void get_noUpdate_randomLong() {
 		final long rowCount= 200000000000L;
 		final long colCount= 20000000000L;
-		this.prefix= new AtomicReference<>();
 		this.store= new LazyRStore<>(rowCount, colCount, 10, noUpdater());
 		final ProgressMonitor m= new NullProgressMonitor();
 		
 		final Random rand= new Random(RANDOM_SEED);
 		final OfLong rows= rand.longs(0, rowCount).iterator();
 		final OfLong cols= rand.longs(0, colCount).iterator();
+		
 		for (int i= 0; i < 100000; i++) {
-			assertFragment(rows.nextLong(), cols.nextLong(), m);
+			assertFragment(rows.nextLong(), cols.nextLong(), null, m);
 		}
 	}
 	
 	
-	private Updater<TestElement> directUpdater() {
+	@Test
+	public void get_ensureCached() {
+		final long rowCount= 100000;
+		final long colCount= 2000000;
+		final AtomicReference<@Nullable String> prefix= new AtomicReference<>();
+		this.store= new LazyRStore<>(rowCount, colCount, 10, directUpdater(prefix));
+		final ProgressMonitor m= new NullProgressMonitor();
+		
+		prefix.set("A");
+		assertFragment(10, 200, "A", m);
+		
+		prefix.set("B");
+		for (int i= 0; i < 9; i++) {
+			assertFragment(10000, i * 10000, "B", m);
+		}
+		
+		assertFragment(10, 200, "A", m);
+	}
+	
+	
+	private Updater<TestElement> directUpdater(final AtomicReference<@Nullable String> prefix) {
 		return new LazyRStore.Updater<LazyRStoreTest.TestElement>() {
-			private final AtomicReference<@Nullable String> prefix= LazyRStoreTest.this.prefix;
 			@Override
 			public void scheduleUpdate(final LazyRStore<TestElement> store,
 					final @Nullable RDataAssignment assignment, final @Nullable Fragment<TestElement> fragment,
 					final int flags, final ProgressMonitor m) {
 				if (fragment != null) {
 					store.updateFragment(fragment,
-							new TestElement(nonNullAssert(this.prefix.get()), fragment) );
+							new TestElement(nonNullAssert(prefix.get()), fragment) );
 				}
 			}
 		};
@@ -274,8 +295,8 @@
 	}
 	
 	private void assertFragment(final long rowIdx, final long colIdx,
+			final @Nullable String expectedPrefix,
 			final ProgressMonitor m) {
-		final String expectedPrefix= this.prefix.get();
 		final String id= String.format("[%1$s,%2$s]", rowIdx, colIdx);
 		try {
 			final Fragment<TestElement> fragment= this.store.getFragment(rowIdx, colIdx, 0, m);