/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.resource.adapter.google.unit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.teiid.translator.google.api.result.PartialResultExecutor;
import org.teiid.translator.google.api.result.RowsResult;
import org.teiid.translator.google.api.result.SheetRow;
/**
* This unit test verifies batch behavior and iteration behavior of RowsResult.
*
* @author fnguyen
*
*/
@SuppressWarnings("nls")
public class RowsResultTest {
@Test
public void simpleIteration(){
final List<SheetRow> rows = new ArrayList<SheetRow>();
rows.add(new SheetRow(new String[]{"a","b","c"}));
rows.add(new SheetRow(new String[]{"a2","b2","c2"}));
rows.add(new SheetRow(new String[]{"a3","b3","c3"}));
RowsResult result = new RowsResult(new PartialResultExecutor() {
boolean called = false;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called)
Assert.fail("getResultsBatch should've been called only once");
called = true;
return rows;
}
}, 10);
int i = 0;
for (SheetRow row : result){
Assert.assertEquals(row, rows.get(i++));
}
}
@Test
public void twoBatchCallsNeeded(){
final List<SheetRow> firstPart = new ArrayList<SheetRow>();
final List<SheetRow> secondPart = new ArrayList<SheetRow>();
final List<SheetRow> all = new ArrayList<SheetRow>();
firstPart.add(new SheetRow(new String[]{"a","b","c"}));
firstPart.add(new SheetRow(new String[]{"a2","b2","c2"}));
firstPart.add(new SheetRow(new String[]{"a3","b3","c3"}));
secondPart.add(new SheetRow(new String[]{"a4","b4","c4"}));
secondPart.add(new SheetRow(new String[]{"a5","b5","c5"}));
all.addAll(firstPart);
all.addAll(secondPart);
RowsResult result = new RowsResult(new PartialResultExecutor() {
int called = 0;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called++ > 2)
Assert.fail("getResultsBatch at most twice");
if (called == 1){
return firstPart;
} else if (called == 2){
return secondPart;
}
//Shouldn't reach here.
return null;
}
}, 3);
int i = 0;
for (SheetRow row : result){
Assert.assertEquals(row, all.get(i++));
}
Assert.assertEquals("Six rows should be in the result",5, i);
}
@Test
public void noRows(){
final List<SheetRow> all = new ArrayList<SheetRow>();
RowsResult result = new RowsResult(new PartialResultExecutor() {
int called = 0;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called++ > 1)
Assert.fail("getResultsBatch at once");
return all;
}
}, 3);
int i = 0;
for (SheetRow row : result){
i++;
}
Assert.assertEquals("No iterations should be made",0, i);
}
@Test
public void sixBatchCalls(){
final List<SheetRow> all = new ArrayList<SheetRow>();
all.add(new SheetRow(new String[]{"a","b","c"}));
all.add(new SheetRow(new String[]{"a2","b2","c2"}));
all.add(new SheetRow(new String[]{"a3","b3","c3"}));
all.add(new SheetRow(new String[]{"a4","b4","c4"}));
all.add(new SheetRow(new String[]{"a5","b5","c5"}));
all.add(new SheetRow(new String[]{"a6","b6","c6"}));
RowsResult result = new RowsResult(new PartialResultExecutor() {
int called = 0;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called > 6)
Assert.fail("getResultsBatch at least 6 times");
if (called == 6)
return new ArrayList<SheetRow>();
return Collections.singletonList(all.get(called++));
}
}, 1);
int i = 0;
for (SheetRow row : result){
Assert.assertEquals(all.get(i++), row);
}
Assert.assertEquals("Six iterations should be made",6, i);
}
@Test
public void offsetTest(){
final List<SheetRow> all = new ArrayList<SheetRow>();
all.add(new SheetRow(new String[]{"a","b","c"}));
all.add(new SheetRow(new String[]{"a2","b2","c2"}));
all.add(new SheetRow(new String[]{"a3","b3","c3"}));
all.add(new SheetRow(new String[]{"a4","b4","c4"}));
all.add(new SheetRow(new String[]{"a5","b5","c5"}));
all.add(new SheetRow(new String[]{"a6","b6","c6"}));
RowsResult result = new RowsResult(new PartialResultExecutor() {
int called = 0;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called++ > 1)
Assert.fail("getResultsBatch at most 2 times");
ArrayList<SheetRow> result = new ArrayList<SheetRow>();
if (called == 1) {
result.add(all.get(3));
result.add(all.get(4));
} else if (called == 2)
result.add(all.get(5));
return result;
}
}, 2);
result.setOffset(3);
result.setLimit(3);
int i = 3;
for (SheetRow row : result){
Assert.assertEquals(all.get(i++), row);
}
Assert.assertEquals("3 iterations should be made",3, i-3);
}
@Test
public void offsetTestOne(){
final List<SheetRow> all = new ArrayList<SheetRow>();
all.add(new SheetRow(new String[]{"a","b","c"}));
all.add(new SheetRow(new String[]{"a2","b2","c2"}));
all.add(new SheetRow(new String[]{"a3","b3","c3"}));
all.add(new SheetRow(new String[]{"a4","b4","c4"}));
all.add(new SheetRow(new String[]{"a5","b5","c5"}));
all.add(new SheetRow(new String[]{"a6","b6","c6"}));
RowsResult result = new RowsResult(new PartialResultExecutor() {
int called = 0;
@Override
public List<SheetRow> getResultsBatch(int startIndex, int endIndex) {
if (called++ > 2)
Assert.fail("getResultsBatch at most 3 times");
ArrayList<SheetRow> result = new ArrayList<SheetRow>();
if (called == 1) {
result.add(all.get(1));
result.add(all.get(2));
} else if (called == 2) {
result.add(all.get(3));
result.add(all.get(4));
} else if (called == 3)
result.add(all.get(5));
return result;
}
}, 2);
result.setOffset(1);
result.setLimit(6);
int i = 1;
for (SheetRow row : result){
Assert.assertEquals(all.get(i++), row);
}
Assert.assertEquals("5 iterations should be made",5, i-1);
}
}