blob: 90037309c8a07c9f8d32457e279ae0d3c1a30289 [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.apache.geode.cache.query.internal;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.apache.geode.cache.query.TypeMismatchException;
import org.apache.geode.cache.query.internal.index.IndexProtocol;
import org.apache.geode.pdx.internal.EnumInfo;
import org.apache.geode.pdx.internal.EnumInfo.PdxInstanceEnumInfo;
public class CompiledInJUnitTest {
ExecutionContext context;
CompiledValue elm;
CompiledValue colln;
@Before
public void setup() {
context = mock(ExecutionContext.class);
elm = mock(CompiledValue.class);
colln = mock(CompiledValue.class);
}
@Test
public void testEnumsShouldCompareCorrectlyToACollectionOfOnePdxEnumInfo() throws Exception {
Object[] objectValues = new Object[] {createPdxInstanceEnumInfo(EnumForTest.ONE, 1)};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(EnumForTest.ONE);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(objectValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEnumsShouldNotCompareCorrectlyIfNotInCollectionOfPdxInstanceEnum()
throws Exception {
Object[] objectValues = new Object[] {createPdxInstanceEnumInfo(EnumForTest.ONE, 1)};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(EnumForTest.TWO);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(objectValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEnumsShouldCompareCorrectlyToACollectionOfPdxEnums() throws Exception {
Object[] objectValues = new Object[] {createPdxInstanceEnumInfo(EnumForTest.ONE, 1),
createPdxInstanceEnumInfo(EnumForTest.TWO, 1)};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(EnumForTest.ONE);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(objectValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testPdxEnumsShouldCompareCorrectlyToACollectionOfOneEnum() throws Exception {
Object[] objectValues = new Object[] {EnumForTest.ONE};
when(elm.evaluate(isA(ExecutionContext.class)))
.thenReturn(createPdxInstanceEnumInfo(EnumForTest.ONE, 1));
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(objectValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testShouldNotThrowTypeMismatchWithNullElementAndObjectArray() throws Exception {
Object[] objectValues = new Object[] {true, true};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(null);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(objectValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
}
@Test
public void testTypeMismatchWithNullElementAndPrimitiveArray() throws Exception {
boolean[] booleanValues = new boolean[] {true, true};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(null);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(booleanValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
try {
Object result = compiledIn.evaluate(context);
fail("TypeMismatchException should be thrown");
} catch (TypeMismatchException e) {
}
}
@Test
public void testEvaluatesFalseForStringAgainstShortArray() throws Exception {
short[] shortValues = new short[] {1, 1};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("1");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(shortValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueForFloatAgainstShortArray() throws Exception {
short[] shortValues = new short[] {1, 1};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(new Float(1.0));
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(shortValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueForShortAgainstShortArray() throws Exception {
short[] shortValues = new short[] {1, 2};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(shortValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueForIntegerAgainstShortArray() throws Exception {
short[] shortValues = new short[] {1, 2};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(new Integer(1));
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(shortValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesFalseForStringAgainstBooleanArray() throws Exception {
boolean[] booleanValues = new boolean[] {true, true};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("true");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(booleanValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesFalseWithBooleanArrayNotMatchingBooleanElement() throws Exception {
boolean[] booleanValues = new boolean[] {true, true};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(false);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(booleanValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueWithBooleanArrayMatchingBooleanElement() throws Exception {
boolean[] booleanValues = new boolean[] {true, true};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(true);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(booleanValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWithBooleanArrayMatchingBooleanFalseElement() throws Exception {
boolean[] booleanValues = new boolean[] {false, false};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(false);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(booleanValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWithCharArrayMatchingCharElement() throws Exception {
char[] charValues = new char[] {'a', 'b', '1'};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn('a');
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(charValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWitCharArrayNotMatchingCharElement() throws Exception {
char[] charValues = new char[] {'a', 'b', '1'};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn('c');
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(charValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testStringDoesNotMatchCharElements() throws Exception {
char[] charValues = new char[] {'a', 'b', '1'};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("a");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(charValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testIntegerDoesNotMatchCharElements() throws Exception {
char[] charValues = new char[] {'a', 'b', '1'};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(97);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(charValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesFalseWithByteArrayNotMatchingIntegerElement() throws Exception {
byte[] byteValues = new byte[] {127, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(127);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(byteValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesFalseWithByteArrayNotMatchingLargerIntegerElement() throws Exception {
byte[] byteValues = new byte[] {127, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(128);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(byteValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueWithByteArrayMatchingByteElement() throws Exception {
byte[] byteValues = new byte[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn((Byte.valueOf("1")));
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(byteValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluateNotMatchingLongElement() throws Exception {
long[] longValues = new long[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(4L);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(longValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueWithLongArrayMatchingLongElement() throws Exception {
long[] longValues = new long[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1L);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(longValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWithSecondElementOfLongArrayMatchingLongElement() throws Exception {
long[] longValues = new long[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(2L);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(longValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWithLongArrayMatchingAndDoubleElement() throws Exception {
long[] longValues = new long[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1D);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(longValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWithLongArrayMatchingAndIntegerElement() throws Exception {
long[] longValues = new long[] {1, 2, 3};
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(new Integer(1));
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(longValues);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testExceptionThrownWhenEvaluateAgainstANonCollection() throws Exception {
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn("NotACollection");
CompiledIn compiledIn = new CompiledIn(elm, colln);
try {
Object result = compiledIn.evaluate(context);
fail("should throw a TypeMismatchException");
} catch (TypeMismatchException e) {
// expected
}
}
@Test
public void testEvaluatesFalseWhenIntegerNotInCollection() throws Exception {
Collection collection = new ArrayList();
collection.add(1);
collection.add(2);
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(3);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueWhenIntegerInIntegerCollection() throws Exception {
Collection collection = new ArrayList();
collection.add(1);
collection.add(2);
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWhenIntegerInSingleElementIntegerCollection() throws Exception {
Collection collection = new ArrayList();
collection.add(1);
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
// String form
@Test
public void testEvaluatesFalseWhenIntegerNotInStringCollection() throws Exception {
Collection collection = new ArrayList();
collection.add("1");
collection.add("2");
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn(1);
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesFalseWhenStringNotInStringCollection() throws Exception {
Collection collection = new ArrayList();
collection.add("1");
collection.add("2");
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("3");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertFalse((Boolean) result);
}
@Test
public void testEvaluatesTrueWhenStringInStringCollection() throws Exception {
Collection collection = new ArrayList();
collection.add("1");
collection.add("2");
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("1");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testEvaluatesTrueWhenStringInSingleElementStringCollection() throws Exception {
Collection collection = new ArrayList();
collection.add("1");
when(elm.evaluate(isA(ExecutionContext.class))).thenReturn("1");
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(collection);
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertTrue((Boolean) result);
}
@Test
public void testCompiledInCanEvaluate() throws Exception {
when(colln.evaluate(isA(ExecutionContext.class))).thenReturn(new ArrayList());
CompiledIn compiledIn = new CompiledIn(elm, colln);
Object result = compiledIn.evaluate(context);
assertNotNull(result);
}
@Test
public void whenPassingIntegerArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
int[] intCollection = new int[] {1, 2};
when(colln.evaluate(any())).thenReturn(intCollection);
callSingleCollectionFilterEvaluateBehavior(intCollection);
}
@Test
public void whenPassingLongArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
long[] longCollection = new long[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(longCollection);
}
@Test
public void whenPassingDoubleArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
double[] doubleCollection = new double[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(doubleCollection);
}
@Test
public void whenPassingCharArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
char[] charCollection = new char[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(charCollection);
}
@Test
public void whenPassingFloatArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
float[] floatCollection = new float[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(floatCollection);
}
@Test
public void whenPassingShortArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
short[] shortCollection = new short[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(shortCollection);
}
@Test
public void whenPassingByteArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
byte[] byteCollection = new byte[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(byteCollection);
}
@Test
public void whenPassingObjectArrayToSingleCollectionFilterEvaluateDoesNotThrowTypeMismatchException()
throws Exception {
Object[] objectCollection = new Object[] {1, 2};
callSingleCollectionFilterEvaluateBehavior(objectCollection);
}
public void callSingleCollectionFilterEvaluateBehavior(Object collection) throws Exception {
CompiledIn compiledIn = new CompiledIn(elm, colln);
when(colln.evaluate(any())).thenReturn(collection);
IndexInfo indexInfo =
new IndexInfo(null, null, mock(IndexProtocol.class), 1, new int[] {1}, 90);
compiledIn.singleBaseCollectionFilterEvaluate(context, new ResultsSet(), false, null, indexInfo,
null, false, false, false);
}
private PdxInstanceEnumInfo createPdxInstanceEnumInfo(Enum<?> e, int enumId) {
EnumInfo ei = new EnumInfo(e);
return (PdxInstanceEnumInfo) ei.getPdxInstance(enumId);
}
private enum EnumForTest {
ONE, TWO, THREE
};
}