package it.cnr.isti.driver.utils;

import static org.mockito.Mockito.stub;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import it.cnr.isti.driver.test.CommonRSTestCase;

import java.util.Collection;

import org.mockito.MockitoAnnotations.Mock;

public class ResultSetTest extends CommonRSTestCase {

	private static final String rsId = "rs-1206811804711-656";
	private ResultSet rs;
	
	@Mock
	private ResultSetClient rsClient;
	
	public void setUp() throws Exception {
		super.setUp();
		
		rs = new ResultSet(epr);
		rs.setResultSetClient(rsClient);
		// common data
		stub(rsClient.getResult(rsId, 1, 2, "waiting", "")).toReturn(new String[] {"one", "two"});
		stub(rsClient.getResult(rsId, 1, 3, "waiting", "")).toReturn(new String[] {"one", "two", null});
		stub(rsClient.getResult(rsId, 3, 3, "waiting", "")).toReturn(new String[] {null});
	}
	
	public void testGetResults() {
		stub(rsClient.getNumberOfElements(rsId)).toReturn(123);
		assertEquals(123, rs.getNumberOfElements());

		Collection<String> data = rs.getResult(1, 2);
		assertEquals(data.size(), 2);
		
		String[] array = (String[]) data.toArray();
		assertEquals(array[0], "one");
		assertEquals(array[1], "two");
		
		// numberOfElements should be saved
		verify(rsClient, times(1)).getNumberOfElements(rsId);
	}

	public void testUpperBounds() {
		stub(rsClient.getNumberOfElements(rsId)).toReturn(2);
		assertEquals(2, rs.getNumberOfElements());
		
		Collection<String> data = rs.getResult(1, 3);
		assertEquals(2, data.size());
		
		verify(rsClient, times(1)).getNumberOfElements(rsId);
	}
	
	public void testLowerBounds() {
		stub(rsClient.getNumberOfElements(rsId)).toReturn(2);
		assertEquals(2, rs.getNumberOfElements());
		
		Collection<String> data = rs.getResult(3, 3);
		assertEquals(0, data.size());
		
		verify(rsClient, times(1)).getNumberOfElements(rsId);
		verify(rsClient, times(0)).getResult(rsId, 3, 3, "waiting", "");
	}	
	
}
