blob: 7b03c48df4a84e2ea571f2626b4528d2264f9e75 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.ofbiz.sql.test;
import java.util.Collections;
import java.util.List;
import org.ofbiz.sql.BetweenCondition;
import org.ofbiz.sql.BooleanCondition;
import org.ofbiz.sql.Condition;
import org.ofbiz.sql.ConditionList;
import org.ofbiz.sql.Joiner;
import org.ofbiz.sql.ListCondition;
import org.ofbiz.sql.NumberValue;
import org.ofbiz.sql.Value;
import org.ofbiz.base.lang.SourceMonitored;
import org.ofbiz.base.test.GenericTestCaseBase;
@SourceMonitored
public class ConditionsTest extends GenericTestCaseBase {
private static final NumberValue<Long> l1 = NumberValue.valueOf(1);
private static final NumberValue<Long> l2 = NumberValue.valueOf(5);
private static final NumberValue<Long> l3 = NumberValue.valueOf(10);
public ConditionsTest(String name) {
super(name);
}
private static <C extends Condition> void basicTest(String label, Class<C> clz, C c, String s, C o, boolean matches) {
assertEquals(label + ":toString", s, c.toString());
assertNotEquals(label + ":not-equals-this", c, ConditionsTest.class);
if (o != null) {
if (matches) {
assertEquals(label + ":equals", o, c);
} else {
assertNotEquals(label + ":not-equals", o, c);
}
}
ConditionVisitorRecorder visitor = new ConditionVisitorRecorder();
c.accept(visitor);
c.accept(visitor);
assertEquals(label + ":visited", 2, visitor.counts.remove(clz).intValue());
assertTrue(label + ":nothing-else-visited", visitor.counts.isEmpty());
}
private static void betweenConditionTest(String label, BetweenCondition c, Value left, Value r1, Value r2, String s, BetweenCondition o, boolean matches) {
assertEquals(label + ":left", left, c.getLeft());
assertEquals(label + ":r1", r1, c.getR1());
assertEquals(label + ":r2", r2, c.getR2());
basicTest(label, BetweenCondition.class, c, s, o, matches);
}
public void testBetweenCondition() {
BetweenCondition c1 = new BetweenCondition(l1, l2, l3);
betweenConditionTest("c1", c1, l1, l2, l3, "1 BETWEEN 5 AND 10", null, false);
BetweenCondition c2 = new BetweenCondition(l3, l1, l2);
betweenConditionTest("c2", c2, l3, l1, l2, "10 BETWEEN 1 AND 5", c1, false);
BetweenCondition c3 = new BetweenCondition(l1, l2, l3);
betweenConditionTest("c3", c3, l1, l2, l3, "1 BETWEEN 5 AND 10", c1, true);
BetweenCondition c4 = new BetweenCondition(l1, l3, l2);
betweenConditionTest("c4", c4, l1, l3, l2, "1 BETWEEN 10 AND 5", c1, false);
BetweenCondition c5 = new BetweenCondition(l1, l2, l1);
betweenConditionTest("c5", c5, l1, l2, l1, "1 BETWEEN 5 AND 1", c1, false);
}
private static void booleanConditionTest(String label, BooleanCondition c, Value left, String op, Value right, String s, BooleanCondition o, boolean matches) {
assertEquals(label + ":left", left, c.getLeft());
assertEquals(label + ":op", op, c.getOp());
assertEquals(label + ":right", right, c.getRight());
basicTest(label, BooleanCondition.class, c, s, o, matches);
}
public void testBooleanCondition() {
BooleanCondition c1 = new BooleanCondition(l1, "=", l2);
booleanConditionTest("c1", c1, l1, "=", l2, "1 = 5", null, false);
BooleanCondition c2 = new BooleanCondition(l1, "=", l3);
booleanConditionTest("c2", c2, l1, "=", l3, "1 = 10", c1, false);
BooleanCondition c3 = new BooleanCondition(l1, "<", l2);
booleanConditionTest("c3", c3, l1, "<", l2, "1 < 5", c1, false);
BooleanCondition c4 = new BooleanCondition(l2, ">", l3);
booleanConditionTest("c4", c4, l2, ">", l3, "5 > 10", c1, false);
BooleanCondition c5 = new BooleanCondition(l1, "=", l2);
booleanConditionTest("c5", c5, l1, "=", l2, "1 = 5", c1, true);
}
private static void conditionListTest(String label, ConditionList c, Joiner joiner, List<? extends Condition> conditions, String s, ConditionList o, boolean matches) {
assertEquals(label + ":joiner", joiner, c.getJoiner());
basicTest(label, ConditionList.class, c, s, o, matches);
BooleanCondition b = new BooleanCondition(l1, "=", l3);
c.add(b);
assertEqualsIterable(label + ":iterable", conditions, Collections.<Condition>emptyList(), false, c, list(b), true);
}
public void testConditionList() {
BooleanCondition b1 = new BooleanCondition(l1, "=", l2);
BooleanCondition b2 = new BooleanCondition(l2, "=", l3);
ConditionList c1 = new ConditionList(Joiner.AND, GenericTestCaseBase.<Condition>list(b1));
conditionListTest("c1", c1, Joiner.AND, list(b1), "( 1 = 5 )", null, false);
ConditionList c2 = new ConditionList(Joiner.AND, GenericTestCaseBase.<Condition>list(b1, b2));
conditionListTest("c2", c2, Joiner.AND, list(b1, b2), "( 1 = 5 AND 5 = 10 )", c1, false);
ConditionList c3 = new ConditionList(Joiner.OR, GenericTestCaseBase.<Condition>list(b2, b1));
conditionListTest("c3", c3, Joiner.OR, list(b2, b1), "( 5 = 10 OR 1 = 5 )", c1, false);
ConditionList c4 = new ConditionList(Joiner.AND, GenericTestCaseBase.<Condition>list(b1));
conditionListTest("c4", c4, Joiner.AND, list(b1), "( 1 = 5 )", c1, true);
}
private static void listConditionTest(String label, ListCondition c, Value left, String op, List<? extends Value> values, String s, ListCondition o, boolean matches) {
assertEquals(label + ":left", left, c.getLeft());
assertEquals(label + ":op", op, c.getOp());
assertEquals(label + ":right", values, c.getValues());
basicTest(label, ListCondition.class, c, s, o, matches);
}
@SuppressWarnings("unchecked")
public void testListCondition() {
ListCondition c1 = new ListCondition(l1, "IN", GenericTestCaseBase.<Value>list(l2));
listConditionTest("c1", c1, l1, "in", list(l2), "1 in (5)", null, false);
ListCondition c2 = new ListCondition(l1, "NOT IN", GenericTestCaseBase.<Value>list(l2));
listConditionTest("c2", c2, l1, "not in", list(l2), "1 not in (5)", c1, false);
ListCondition c3 = new ListCondition(l2, "IN", GenericTestCaseBase.<Value>list(l3));
listConditionTest("c3", c3, l2, "in", list(l3), "5 in (10)", c1, false);
ListCondition c4 = new ListCondition(l1, "IN", GenericTestCaseBase.<Value>list(l2, l3));
listConditionTest("c4", c4, l1, "in", list(l2, l3), "1 in (5, 10)", c1, false);
ListCondition c5 = new ListCondition(l1, "IN", GenericTestCaseBase.<Value>list(l2));
listConditionTest("c5", c5, l1, "in", list(l2), "1 in (5)", c1, true);
}
public static class ConditionVisitorRecorder extends Recorder<Class<? extends Condition>> implements Condition.Visitor {
public void visit(BetweenCondition condition) {
record(BetweenCondition.class);
}
public void visit(BooleanCondition condition) {
record(BooleanCondition.class);
}
public void visit(ConditionList condition) {
record(ConditionList.class);
}
public void visit(ListCondition condition) {
record(ListCondition.class);
}
}
}