/* * 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.*; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.*; import java.util.ArrayList; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.cache.query.TypeMismatchException; import org.apache.geode.pdx.internal.EnumInfo; import org.apache.geode.pdx.internal.EnumInfo.PdxInstanceEnumInfo; import org.apache.geode.test.junit.categories.UnitTest; @Category(UnitTest.class) 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); } private PdxInstanceEnumInfo createPdxInstanceEnumInfo(Enum<?> e, int enumId) { EnumInfo ei = new EnumInfo(e); return (PdxInstanceEnumInfo) ei.getPdxInstance(enumId); } private enum EnumForTest { ONE, TWO, THREE }; }