package org.test4j.tools.datagen;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.test4j.tools.commons.ArrayHelper;
public class DataProviderIterator<T> implements Iterator<T[]> {
private List<T[]> datas = new ArrayList<T[]>();
private Iterator<T[]> it = null;
public void data(T... data) {
this.checkDataLength(data);
this.datas.add(data);
this.index++;
}
public boolean hasNext() {
this.initIterator();
return it.hasNext();
}
public T[] next() {
this.initIterator();
return it.next();
}
public void remove() {
this.initIterator();
it.remove();
}
private synchronized void initIterator() {
if (it == null) {
it = this.datas.iterator();
}
}
private int index = 1;
private int prev = 0;
private String ERROR_MSG = "DataProvider error, the previous data length is %d, but current data(data index %d) %s length is %d.";
/**
* 检查数据长度是否一致
*
* @param o
* @param data
*/
private void checkDataLength(T... data) {
int length = data.length;
if (length == 0) {
throw new RuntimeException(String.format("provider data(index %d) error, can't be empty.", index));
}
if (prev == 0 || prev == length) {
prev = length;
} else {
String datas = ArrayHelper.toString(data);
String error = String.format(ERROR_MSG, prev, index, datas, length);
throw new RuntimeException(error);
}
}
}