/*
* 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.
*/
package org.elasticsearch.painless;
import org.elasticsearch.test.ESTestCase;
import static java.util.Collections.singletonMap;
// TODO: Figure out a way to test autobox caching properly from methods such as Integer.valueOf(int);
public class EqualsTests extends ScriptTestCase {
public void testTypesEquals() {
assertEquals(true, exec("return false === false;"));
assertEquals(false, exec("boolean x = false; boolean y = true; return x === y;"));
assertEquals(true, exec("boolean x = false; boolean y = false; return x === y;"));
assertEquals(false, exec("return (byte)3 === (byte)4;"));
assertEquals(true, exec("byte x = 3; byte y = 3; return x === y;"));
assertEquals(false, exec("return (char)3 === (char)4;"));
assertEquals(true, exec("char x = 3; char y = 3; return x === y;"));
assertEquals(false, exec("return (short)3 === (short)4;"));
assertEquals(true, exec("short x = 3; short y = 3; return x === y;"));
assertEquals(false, exec("return (int)3 === (int)4;"));
assertEquals(true, exec("int x = 3; int y = 3; return x === y;"));
assertEquals(false, exec("return (long)3 === (long)4;"));
assertEquals(true, exec("long x = 3; long y = 3; return x === y;"));
assertEquals(false, exec("return (float)3 === (float)4;"));
assertEquals(true, exec("float x = 3; float y = 3; return x === y;"));
assertEquals(false, exec("return (double)3 === (double)4;"));
assertEquals(true, exec("double x = 3; double y = 3; return x === y;"));
assertEquals(true, exec("return false == false;"));
assertEquals(false, exec("boolean x = false; boolean y = true; return x == y;"));
assertEquals(true, exec("boolean x = false; boolean y = false; return x == y;"));
assertEquals(false, exec("return (byte)3 == (byte)4;"));
assertEquals(true, exec("byte x = 3; byte y = 3; return x == y;"));
assertEquals(false, exec("return (char)3 == (char)4;"));
assertEquals(true, exec("char x = 3; char y = 3; return x == y;"));
assertEquals(false, exec("return (short)3 == (short)4;"));
assertEquals(true, exec("short x = 3; short y = 3; return x == y;"));
assertEquals(false, exec("return (int)3 == (int)4;"));
assertEquals(true, exec("int x = 3; int y = 3; return x == y;"));
assertEquals(false, exec("return (long)3 == (long)4;"));
assertEquals(true, exec("long x = 3; long y = 3; return x == y;"));
assertEquals(false, exec("return (float)3 == (float)4;"));
assertEquals(true, exec("float x = 3; float y = 3; return x == y;"));
assertEquals(false, exec("return (double)3 == (double)4;"));
assertEquals(true, exec("double x = 3; double y = 3; return x == y;"));
}
public void testTypesNotEquals() {
assertEquals(false, exec("return true !== true;"));
assertEquals(true, exec("boolean x = true; boolean y = false; return x !== y;"));
assertEquals(false, exec("boolean x = false; boolean y = false; return x !== y;"));
assertEquals(true, exec("return (byte)3 !== (byte)4;"));
assertEquals(false, exec("byte x = 3; byte y = 3; return x !== y;"));
assertEquals(true, exec("return (char)3 !== (char)4;"));
assertEquals(false, exec("char x = 3; char y = 3; return x !== y;"));
assertEquals(true, exec("return (short)3 !== (short)4;"));
assertEquals(false, exec("short x = 3; short y = 3; return x !== y;"));
assertEquals(true, exec("return (int)3 !== (int)4;"));
assertEquals(false, exec("int x = 3; int y = 3; return x !== y;"));
assertEquals(true, exec("return (long)3 !== (long)4;"));
assertEquals(false, exec("long x = 3; long y = 3; return x !== y;"));
assertEquals(true, exec("return (float)3 !== (float)4;"));
assertEquals(false, exec("float x = 3; float y = 3; return x !== y;"));
assertEquals(true, exec("return (double)3 !== (double)4;"));
assertEquals(false, exec("double x = 3; double y = 3; return x !== y;"));
assertEquals(false, exec("return true != true;"));
assertEquals(true, exec("boolean x = true; boolean y = false; return x != y;"));
assertEquals(false, exec("boolean x = false; boolean y = false; return x != y;"));
assertEquals(true, exec("return (byte)3 != (byte)4;"));
assertEquals(false, exec("byte x = 3; byte y = 3; return x != y;"));
assertEquals(true, exec("return (char)3 != (char)4;"));
assertEquals(false, exec("char x = 3; char y = 3; return x != y;"));
assertEquals(true, exec("return (short)3 != (short)4;"));
assertEquals(false, exec("short x = 3; short y = 3; return x != y;"));
assertEquals(true, exec("return (int)3 != (int)4;"));
assertEquals(false, exec("int x = 3; int y = 3; return x != y;"));
assertEquals(true, exec("return (long)3 != (long)4;"));
assertEquals(false, exec("long x = 3; long y = 3; return x != y;"));
assertEquals(true, exec("return (float)3 != (float)4;"));
assertEquals(false, exec("float x = 3; float y = 3; return x != y;"));
assertEquals(true, exec("return (double)3 != (double)4;"));
assertEquals(false, exec("double x = 3; double y = 3; return x != y;"));
}
public void testEquals() {
assertEquals(true, exec("return 3 == 3;"));
assertEquals(false, exec("int x = 4; int y = 5; x == y"));
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x == y;"));
assertEquals(true, exec("int[] x = new int[1]; Object y = x; return x === y;"));
assertEquals(false, exec("int[] x = new int[1]; Object y = new int[1]; return x == y;"));
assertEquals(false, exec("int[] x = new int[1]; Object y = new int[1]; return x === y;"));
assertEquals(false, exec("Map x = new HashMap(); List y = new ArrayList(); return x == y;"));
assertEquals(false, exec("Map x = new HashMap(); List y = new ArrayList(); return x === y;"));
}
public void testNotEquals() {
assertEquals(false, exec("return 3 != 3;"));
assertEquals(true, exec("int x = 4; int y = 5; x != y"));
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x != y;"));
assertEquals(false, exec("int[] x = new int[1]; Object y = x; return x !== y;"));
assertEquals(true, exec("int[] x = new int[1]; Object y = new int[1]; return x != y;"));
assertEquals(true, exec("int[] x = new int[1]; Object y = new int[1]; return x !== y;"));
assertEquals(true, exec("Map x = new HashMap(); List y = new ArrayList(); return x != y;"));
assertEquals(true, exec("Map x = new HashMap(); List y = new ArrayList(); return x !== y;"));
}
public void testBranchEquals() {
assertEquals(0, exec("def a = (char)'a'; def b = (char)'b'; if (a == b) return 1; else return 0;"));
assertEquals(1, exec("def a = (char)'a'; def b = (char)'a'; if (a == b) return 1; else return 0;"));
assertEquals(1, exec("def a = 1; def b = 1; if (a === b) return 1; else return 0;"));
assertEquals(1, exec("def a = (char)'a'; def b = (char)'a'; if (a === b) return 1; else return 0;"));
assertEquals(1, exec("def a = (char)'a'; Object b = a; if (a === b) return 1; else return 0;"));
assertEquals(1, exec("def a = 1; Number b = a; Number c = a; if (c === b) return 1; else return 0;"));
assertEquals(0, exec("def a = 1; Object b = new HashMap(); if (a === (Object)b) return 1; else return 0;"));
}
public void testBranchEqualsDefAndPrimitive() {
/* This test needs an Integer that isn't cached by Integer.valueOf so we draw one randomly. We can't use any fixed integer because
* we can never be sure that the JVM hasn't configured itself to cache that Integer. It is sneaky like that. */
int uncachedAutoboxedInt = randomValueOtherThanMany(i -> Integer.valueOf(i) == Integer.valueOf(i), ESTestCase::randomInt);
assertEquals(true, exec("def x = params.i; int y = params.i; return x == y;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(false, exec("def x = params.i; int y = params.i; return x === y;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(true, exec("def x = params.i; int y = params.i; return y == x;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(false, exec("def x = params.i; int y = params.i; return y === x;", singletonMap("i", uncachedAutoboxedInt), true));
}
public void testBranchNotEquals() {
assertEquals(1, exec("def a = (char)'a'; def b = (char)'b'; if (a != b) return 1; else return 0;"));
assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a != b) return 1; else return 0;"));
assertEquals(0, exec("def a = 1; def b = 1; if (a !== b) return 1; else return 0;"));
assertEquals(0, exec("def a = (char)'a'; def b = (char)'a'; if (a !== b) return 1; else return 0;"));
assertEquals(0, exec("def a = (char)'a'; Object b = a; if (a !== b) return 1; else return 0;"));
assertEquals(0, exec("def a = 1; Number b = a; Number c = a; if (c !== b) return 1; else return 0;"));
assertEquals(1, exec("def a = 1; Object b = new HashMap(); if (a !== (Object)b) return 1; else return 0;"));
}
public void testBranchNotEqualsDefAndPrimitive() {
/* This test needs an Integer that isn't cached by Integer.valueOf so we draw one randomly. We can't use any fixed integer because
* we can never be sure that the JVM hasn't configured itself to cache that Integer. It is sneaky like that. */
int uncachedAutoboxedInt = randomValueOtherThanMany(i -> Integer.valueOf(i) == Integer.valueOf(i), ESTestCase::randomInt);
assertEquals(false, exec("def x = params.i; int y = params.i; return x != y;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(true, exec("def x = params.i; int y = params.i; return x !== y;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(false, exec("def x = params.i; int y = params.i; return y != x;", singletonMap("i", uncachedAutoboxedInt), true));
assertEquals(true, exec("def x = params.i; int y = params.i; return y !== x;", singletonMap("i", uncachedAutoboxedInt), true));
}
public void testRightHandNull() {
assertEquals(false, exec("HashMap a = new HashMap(); return a == null;"));
assertEquals(false, exec("HashMap a = new HashMap(); return a === null;"));
assertEquals(true, exec("HashMap a = new HashMap(); return a != null;"));
assertEquals(true, exec("HashMap a = new HashMap(); return a !== null;"));
}
public void testLeftHandNull() {
assertEquals(false, exec("HashMap a = new HashMap(); return null == a;"));
assertEquals(false, exec("HashMap a = new HashMap(); return null === a;"));
assertEquals(true, exec("HashMap a = new HashMap(); return null != a;"));
assertEquals(true, exec("HashMap a = new HashMap(); return null !== a;"));
}
}