package com.taobao.tddl.rule.enumerator; import static com.taobao.tddl.rule.TestUtils.Equivalent; import static com.taobao.tddl.rule.TestUtils.GreaterThan; import static com.taobao.tddl.rule.TestUtils.LessThan; import static com.taobao.tddl.rule.TestUtils.LessThanOrEqual; import static com.taobao.tddl.rule.TestUtils.gand; import static com.taobao.tddl.rule.TestUtils.gcomp; import static com.taobao.tddl.rule.TestUtils.gor; import static org.junit.Assert.assertEquals; import java.util.Set; import org.junit.Test; import com.taobao.tddl.rule.TestUtils; import com.taobao.tddl.rule.model.sqljep.Comparative; public class IntegerPartDiscontinousRangeEnumeratorUnitTest { /* * T:测试在有自增和没有自增的情况下 对于close interval的处理, 在有自增和range的情况下测试 x = ? or (x > ? * and x < ?) 测试开区间 ,测试x>5 and x>10,测试x >= 3 and x < 5取值是否正确 测试x>3 and * x<5取值是否正确。 测试x >=3 and x=3的时候返回是否正确。 */ Comparative btc = null; Enumerator e = new EnumeratorImp(); boolean needMergeValueInCloseRange = true; @Test public void test_没有自增的closeinterval() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(5, LessThanOrEqual)); try { e.getEnumeratedValue(btc, null, null, needMergeValueInCloseRange); } catch (IllegalArgumentException e) { assertEquals("当原子增参数或叠加参数为空时,不支持在sql中使用范围选择,如id>? and id<?", e.getMessage()); } } @Test public void test_带有自增的closeInterval() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(5, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 16, 64, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 4, 5 }, s); } // --------------------------------------------------以下是一些对两个and节点上挂两个参数一些情况的单元测试。 // 因为从公共逻辑测试中已经测试了> 在处理中会转变为>= 而< 在处理中会转为<= 因此只需要测试> = < // 在and,两个节点的情况下的可能性即可。 @Test public void test_带有自增的closeInterval_1() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(5, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 64, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 4, 5 }, s); } @Test public void test_足够大的一个范围选择函数_远远大于一个y的变动周期() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(1000, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 4, 5, 6, 7, 8 }, s); } @Test public void test_开区间() throws Exception { btc = gand(gcomp(3, LessThanOrEqual), gcomp(5, GreaterThan)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] {}, s); } @Test public void test_一个大于一个null在一个and中() throws Exception { btc = gand(gcomp(3, LessThanOrEqual), null); try { e.getEnumeratedValue(btc, 64, 1, needMergeValueInCloseRange); } catch (IllegalArgumentException e) { assertEquals("input value is not a comparative: null", e.getMessage()); } } @Test public void test_一个小于() throws Exception { btc = gcomp(3, LessThanOrEqual); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); // TestUtils.testSet(new Object[]{3,2,1,0,-1},s ); TestUtils.testSet(new Object[] { 3, 2, 1, 0 }, s); // 默认忽略负数 } @Test public void test_两个小于等于() throws Exception { btc = gand(gcomp(3, LessThanOrEqual), gcomp(5, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); // TestUtils.testSet(new Object[]{3,2,1,0,-1},s ); TestUtils.testSet(new Object[] { 3, 2, 1, 0 }, s); // 默认忽略负数 } @Test public void test_一个小于一个等于() throws Exception { btc = gand(gcomp(3, LessThanOrEqual), gcomp(5, Equivalent)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] {}, s); } @Test public void test_一个等于一个小于() throws Exception { btc = gand(gcomp(3, Equivalent), gcomp(5, LessThan)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 3 }, s); } @Test public void test_一个等于一个大于() throws Exception { btc = gand(gcomp(3, Equivalent), gcomp(5, GreaterThan)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] {}, s); } @Test public void test_一个大于一个等于() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(5, Equivalent)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 5 }, s); } @Test public void test_两个等于() throws Exception { btc = gand(gcomp(3, LessThanOrEqual), gcomp(5, Equivalent)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] {}, s); } @Test public void test_两个大于不是大于等于() throws Exception { btc = gand(gcomp(3, GreaterThan), gcomp(5, GreaterThan)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 6, 7, 8, 9, 10 }, s); } // -------------------------------------or和and共同作用完成的功能。 // T:主要目标是测试or+and范围的时候的枚举系统的表现。 @Test public void test_X等于2OrX大于3AndX小于5() throws Exception { btc = gor(gcomp(1, Equivalent), gand(gcomp(3, GreaterThan), gcomp(5, LessThanOrEqual))); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 1, 4, 5 }, s); } @Test public void test_x在两个范围内同时两个范围之间是or关系() throws Exception { btc = gor(gand(gcomp(1, GreaterThan), gcomp(3, LessThanOrEqual)), gand(gcomp(5, GreaterThan), gcomp(7, LessThanOrEqual))); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 2, 3, 6, 7 }, s); } @Test public void test_x在一个是无界的而另一个是有界的_他们之间是or关系() throws Exception { // 这个条件下,系统只需要返回一组能够代表整个定义域内所有引起y变化的x的对应值的描点即可。 // 因此不需要返回7这个数据。 btc = gor(gcomp(1, GreaterThan), gand(gcomp(5, GreaterThan), gcomp(7, LessThanOrEqual))); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 2, 3, 4, 5, 6 }, s); } @Test public void test_x一边是无界的而另一边是一个and开区间_他们之间是or关系() throws Exception { btc = gor(gcomp(1, GreaterThan), gand(gcomp(5, LessThan), gcomp(7, GreaterThan))); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 2, 3, 4, 5, 6 }, s); } @Test public void test_复杂范围关系() throws Exception { btc = gor(gand(gcomp(1, GreaterThan), gcomp(3, LessThanOrEqual)), gor(gand(gcomp(8, GreaterThan), gcomp(10, LessThanOrEqual)), gand(gcomp(5, GreaterThan), gcomp(7, LessThan)))); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 3, 2, 6, 9, 10 }, s); } // @Test // public void test_性能测试() throws Exception{ // Comparative par = null; // for(int i = 0 ;i< 1000;i++){ // par = gor(par,gcomp(i,Equivalent)); // } // btc = par; // long time = System.currentTimeMillis(); // for(int i = 0;i< 10000;i++){ // e.getEnumeratedValue(btc, 5, 1); // } // System.out.println(System.currentTimeMillis()-time); // // TestUtils.testSet(new Object[]{3,2,6,9,10}, s); // } // 2000ms运行10000次,虽然比那边好点不过有限 // }