package org.elasticsearch.plan.a; import java.util.Collections; /* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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. */ public class BasicExpressionTests extends ScriptTestCase { /** simple tests returning a constant value */ public void testReturnConstant() { assertEquals(5, exec("return 5;")); assertEquals(7L, exec("return 7L;")); assertEquals(7.0, exec("return 7.0;")); assertEquals(32.0F, exec("return 32.0F;")); assertEquals((byte)255, exec("return (byte)255;")); assertEquals((short)5, exec("return (short)5;")); assertEquals("string", exec("return \"string\";")); assertEquals(true, exec("return true;")); assertEquals(false, exec("return false;")); assertNull(exec("return null;")); } public void testReturnConstantChar() { assertEquals('x', exec("return 'x';")); } public void testConstantCharTruncation() { assertEquals('čš ', exec("return (char)100000;")); } /** declaring variables for primitive types */ public void testDeclareVariable() { assertEquals(5, exec("int i = 5; return i;")); assertEquals(7L, exec("long l = 7; return l;")); assertEquals(7.0, exec("double d = 7; return d;")); assertEquals(32.0F, exec("float f = 32F; return f;")); assertEquals((byte)255, exec("byte b = (byte)255; return b;")); assertEquals((short)5, exec("short s = (short)5; return s;")); assertEquals("string", exec("string s = \"string\"; return s;")); assertEquals(true, exec("bool v = true; return v;")); assertEquals(false, exec("bool v = false; return v;")); } /** incrementing byte values */ public void testIncrementByte() { assertEquals((byte)0, exec("byte x = (byte)0; return x++;")); assertEquals((byte)0, exec("byte x = (byte)0; return x--;")); assertEquals((byte)1, exec("byte x = (byte)0; return ++x;")); assertEquals((byte)-1, exec("byte x = (byte)0; return --x;")); } /** incrementing short values */ public void testIncrementShort() { assertEquals((short)0, exec("short x = (short)0; return x++;")); assertEquals((short)0, exec("short x = (short)0; return x--;")); assertEquals((short)1, exec("short x = (short)0; return ++x;")); assertEquals((short)-1, exec("short x = (short)0; return --x;")); } /** incrementing integer values */ public void testIncrementInt() { assertEquals(0, exec("int x = 0; return x++;")); assertEquals(0, exec("int x = 0; return x--;")); assertEquals(1, exec("int x = 0; return ++x;")); assertEquals(-1, exec("int x = 0; return --x;")); } /** incrementing long values */ public void testIncrementLong() { assertEquals(0L, exec("long x = 0; return x++;")); assertEquals(0L, exec("long x = 0; return x--;")); assertEquals(1L, exec("long x = 0; return ++x;")); assertEquals(-1L, exec("long x = 0; return --x;")); } /** incrementing float values */ public void testIncrementFloat() { assertEquals(0F, exec("float x = 0F; return x++;")); assertEquals(0F, exec("float x = 0F; return x--;")); assertEquals(1F, exec("float x = 0F; return ++x;")); assertEquals(-1F, exec("float x = 0F; return --x;")); } /** incrementing double values */ public void testIncrementDouble() { assertEquals(0D, exec("double x = 0.0; return x++;")); assertEquals(0D, exec("double x = 0.0; return x--;")); assertEquals(1D, exec("double x = 0.0; return ++x;")); assertEquals(-1D, exec("double x = 0.0; return --x;")); } public void testUnary() { assertEquals(false, exec("return !true;")); assertEquals(true, exec("bool x = false; return !x;")); assertEquals(-2, exec("return ~1;")); assertEquals(-2, exec("byte x = 1; return ~x;")); assertEquals(1, exec("return +1;")); assertEquals(1.0, exec("double x = 1; return +x;")); assertEquals(-1, exec("return -1;")); assertEquals(-2, exec("short x = 2; return -x;")); } public void testCast() { assertEquals(1, exec("return (int)true;")); assertEquals((byte)100, exec("double x = 100; return (byte)x;")); assertEquals(3, exec( "map x = hashmap.new();\n" + "object y = x;\n" + "((map)y).put(2, 3);\n" + "return x.get(2);\n")); } public void testCat() { assertEquals("aaabbb", exec("return \"aaa\" .. \"bbb\";")); assertEquals("aaabbb", exec("string aaa = \"aaa\", bbb = \"bbb\"; return aaa .. bbb;")); assertEquals("aaabbbbbbbbb", exec( "string aaa = \"aaa\", bbb = \"bbb\"; int x;\n" + "for (; x < 3; ++x) \n" + " aaa ..= bbb;\n" + "return aaa;")); } public void testComp() { assertEquals(true, exec("return 2 < 3;")); assertEquals(false, exec("int x = 4; char y = 2; return x < y;")); assertEquals(true, exec("return 3 <= 3;")); assertEquals(true, exec("int x = 3; char y = 3; return x <= y;")); assertEquals(false, exec("return 2 > 3;")); assertEquals(true, exec("int x = 4; long y = 2; return x > y;")); assertEquals(false, exec("return 3 >= 4;")); assertEquals(true, exec("double x = 3; float y = 3; return x >= y;")); assertEquals(false, exec("return 3 == 4;")); assertEquals(true, exec("double x = 3; float y = 3; return x == y;")); assertEquals(true, exec("return 3 != 4;")); assertEquals(false, exec("double x = 3; float y = 3; return x != y;")); } /** * Test boxed objects in various places */ public void testBoxing() { // return assertEquals(4, exec("return input.get(\"x\");", Collections.singletonMap("x", 4))); // assignment assertEquals(4, exec("int y = (intobj)input.get(\"x\"); return y;", Collections.singletonMap("x", 4))); // comparison assertEquals(true, exec("return 5 > (intobj)input.get(\"x\");", Collections.singletonMap("x", 4))); } public void testBool() { assertEquals(true, exec("return true && true;")); assertEquals(false, exec("bool a = true, b = false; return a && b;")); assertEquals(true, exec("return true || true;")); assertEquals(true, exec("bool a = true, b = false; return a || b;")); } public void testConditional() { assertEquals(1, exec("int x = 5; return x > 3 ? 1 : 0;")); assertEquals(0, exec("string a = null; return a != null ? 1 : 0;")); } public void testPrecedence() { assertEquals(2, exec("int x = 5; return (x+x)/x;")); assertEquals(true, exec("bool t = true, f = false; return t && (f || t);")); } public void testNegationInt() throws Exception { assertEquals(-1, exec("return -1;")); assertEquals(1, exec("return -(-1);")); assertEquals(0, exec("return -0;")); } }