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 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 LongPartDiscontinousRangeEnumeratorUnitTest { /* * 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(3l, GreaterThan), gcomp(5l, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 16, 64, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 4l, 5l }, s); } // --------------------------------------------------以下是一些对两个and节点上挂两个参数一些情况的单元测试。 // 因为从公共逻辑测试中已经测试了> 在处理中会转变为>= 而< 在处理中会转为<= 因此只需要测试> = < // 在and,两个节点的情况下的可能性即可。 @Test public void test_带有自增的closeInterval_1() throws Exception { btc = gand(gcomp(3l, GreaterThan), gcomp(5l, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 64, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 4l, 5l }, 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(3l, LessThanOrEqual); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); // TestUtils.testSet(new Object[]{3l,2l,1l,0l,-1l},s );//默认忽略负数 TestUtils.testSet(new Object[] { 3l, 2l, 1l, 0l, }, s); } @Test public void test_两个小于等于() throws Exception { btc = gand(gcomp(3l, LessThanOrEqual), gcomp(5l, LessThanOrEqual)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); // TestUtils.testSet(new Object[]{3l,2l,1l,0l,-1l},s );//默认忽略负数 TestUtils.testSet(new Object[] { 3l, 2l, 1l, 0l }, 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(3l, GreaterThan), gcomp(5l, GreaterThan)); Set<Object> s = e.getEnumeratedValue(btc, 5, 1, needMergeValueInCloseRange); TestUtils.testSet(new Object[] { 6l, 7l, 8l, 9l, 10l }, s); } }