### Question:
TableStoreImpl implements TableStore { @Override public CompletableFuture<RangeResponse> range(RangeRequest rangeReq) { if (log.isTraceEnabled()) { log.trace("Received range request {}", rangeReq); } return doRange(rangeReq) .thenApply(result -> { try { RangeResponse rangeResp = processRangeResult( rangeReq.getHeader(), result); return rangeResp; } finally { result.close(); } }) .exceptionally(cause -> { log.error("Failed to process range request {}", rangeReq, cause); return RangeResponse.newBuilder() .setHeader(ResponseHeader.newBuilder() .setCode(handleCause(cause)) .setRoutingHeader(rangeReq.getHeader()) .build()) .build(); }); } TableStoreImpl(MVCCAsyncStore<byte[], byte[]> store); @Override CompletableFuture<RangeResponse> range(RangeRequest rangeReq); @Override CompletableFuture<PutResponse> put(PutRequest putReq); @Override CompletableFuture<IncrementResponse> incr(IncrementRequest incrementReq); @Override CompletableFuture<DeleteRangeResponse> delete(DeleteRangeRequest deleteReq); @Override CompletableFuture<TxnResponse> txn(TxnRequest txnReq);  }### Answer:
@Test public void testPutGetDeleteRanges() throws Exception { int numPairs = 100; List<KeyValue> prevKvs = writeKVs(numPairs, true); assertEquals(numPairs, prevKvs.size()); for (KeyValue prevKv : prevKvs) { assertNull(prevKv); } verifyRange(20, 70, 2, 2, 0); prevKvs = deleteRange(20, 70); assertNotNull(prevKvs); verifyRecords( prevKvs, 20, 70, 2, 2, 0); prevKvs = range(20, 70); assertTrue(prevKvs.isEmpty()); }