package cn.org.rapid_framework.generator;
import java.util.ArrayList;
import java.util.List;
public class GeneratorTestCaseUtil {
public GeneratorTestCaseUtil(){
}
/**
* 取得所有的case的下标
* @param maxCase like "11"
* @return
*/
private static List<int[]> getCaseIndex(int[] maxCase,TC[][] metaData){
List<int[]> result=new ArrayList<int[]>();
int cases[]=new int[maxCase.length];
int times=1;
//计算case个数
for (int i : maxCase) {
times=times*i;
}
if(checkIfAdd(cases,metaData)){
result.add(cases.clone());
}
for(int i=0;i<times;i++){
if(increase(maxCase,cases,0)){
if(checkIfAdd(cases,metaData)){
result.add(cases.clone());
}
}
}
return result;
}
/**
* 检查某个用例是否需要加到用例集中
* @param cases
* @param metaDataTimes
* @return
*/
private static boolean checkIfAdd(int[] cases,TC[][] metaData){
for(int i=0;i<cases.length;i++){
if(metaData[i][cases[i]].getTimes()<0){
continue;
}
if(metaData[i][cases[i]].getTimes()==0){//如果不再需要用例,则返回false,不加到用例集中
return false;
}else{
metaData[i][cases[i]].setTimes(metaData[i][cases[i]].getTimes()-1);
return true;
}
}
return true;
}
/**
* case下标加一
* @param acase
* @param index
* @return
*/
private static boolean increase(int[] maxCase,int[] acase,int index){
if(index>=acase.length){
return false;
}
//达到最大值时进一
if(acase[index]==maxCase[index]-1){
if(increase(maxCase,acase, index+1)){
acase[index]=0;
}else{
return false;
}
}else{
acase[index]=acase[index]+1;
}
return true;
}
/**
* 从元素据获取用例
* @param metaData
* @return
*/
public static Object [][] getCase(TC[][] metaData){
int[] maxCase=new int[metaData.length];
for (int i=0; i<maxCase.length;i++) {
maxCase[i]=metaData[i].length;
}
List<int[]> caseIndex=getCaseIndex(maxCase,metaData);
List<Object[]> result=new ArrayList<Object[]>();
for (int[] ci : caseIndex) {
Object[] acase=new Object[ci.length];
for(int i=0;i<ci.length;i++){
acase[i]=metaData[i][ci[i]].getObj();
}
result.add(acase);
}
Object [][]objArray=new Object[result.size()][];
for (int i=0;i< result.size();i++ ) {
objArray[i]=result.get(i);
}
return objArray;
}
private static String ObjectArraytoString(Object[][] cases){
StringBuilder result=new StringBuilder();
for (Object[] objArray : cases) {
result.append("{");
for (Object object : objArray) {
if(object==null){
result.append("null");
}else if(object instanceof String){
result.append("\"");
result.append(object);
result.append("\"");
}else{
result.append(object);
}
result.append(",");
}
result.deleteCharAt(result.length()-1);
result.append("}");
result.append(",\n");
}
result.deleteCharAt(result.length()-2);
return result.toString();
}
public static void main(String []args){
TC[][] metaData=new TC[][] {
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1),new TC(1,-1)},
{new TC(null,-1)},
{new TC(null,-1)},
{new TC(null,1),new TC(1,-1),new TC(0,-1)},
{new TC(1,-1)},
{new TC(20,-1)},
{new TC(null,1),new TC(1,-1),new TC(0,-1)}
};
Object[][] cases= GeneratorTestCaseUtil.getCase(metaData);
System.out.println(ObjectArraytoString(cases));
System.out.println("用例集个数:"+cases.length);
}
}