/*
* 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;
/** Tests for shift operator across all types */
public class ShiftTests extends ScriptTestCase {
public void testBasics() {
assertEquals(1 << 2, exec("return 1 << 2;"));
assertEquals(4 >> 2, exec("return 4 >> 2;"));
assertEquals(-1 >>> 29, exec("return -1 >>> 29;"));
assertEquals(4, exec("int x = 1; char y = 2; return x << y;"));
assertEquals(-1, exec("int x = -1; char y = 29; return x >> y;"));
assertEquals(3, exec("int x = -1; char y = 30; return x >>> y;"));
}
public void testLongShifts() {
assertEquals(1L << 2, exec("long x = 1L; int y = 2; return x << y;"));
assertEquals(1 << 2L, exec("int x = 1; long y = 2L; return x << y;"));
assertEquals(4 >> 2L, exec("int x = 4; long y = 2L; return x >> y;"));
assertEquals(4L >> 2, exec("long x = 4L; int y = 2; return x >> y;"));
assertEquals(-1L >>> 29, exec("long x = -1L; int y = 29; return x >>> y;"));
assertEquals(-1 >>> 29L, exec("int x = -1; long y = 29L; return x >>> y;"));
}
public void testLongShiftsConst() {
assertEquals(1L << 2, exec("return 1L << 2;"));
assertEquals(1 << 2L, exec("return 1 << 2L;"));
assertEquals(4 >> 2L, exec("return 4 >> 2L;"));
assertEquals(4L >> 2, exec("return 4L >> 2;"));
assertEquals(-1L >>> 29, exec("return -1L >>> 29;"));
assertEquals(-1 >>> 29L, exec("return -1 >>> 29L;"));
}
public void testBogusShifts() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("long x = 1L; float y = 2; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1; double y = 2L; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; int y = 2; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; int y = 2L; return x << y;");
});
}
public void testBogusShiftsConst() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("return 1L << 2F;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("return 1L << 2.0;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("return 1F << 2;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("return 1D << 2L");
});
}
public void testLshDef() {
assertEquals(2, exec("def x = (byte)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (byte)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; def y = (short)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (short)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (short)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (short)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (short)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; def y = (char)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (char)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (char)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (char)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (char)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; def y = (int)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (int)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (int)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (int)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (int)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; def y = (long)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (long)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (long)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (long)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (long)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (short)1; def y = (short)1; return x << y"));
assertEquals(2, exec("def x = (char)1; def y = (char)1; return x << y"));
assertEquals(2, exec("def x = (int)1; def y = (int)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; def y = (long)1; return x << y"));
}
public void testLshDefTypedLHS() {
assertEquals(2, exec("byte x = (byte)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (byte)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("byte x = (byte)1; def y = (short)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (short)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (short)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (short)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (short)1; return x << y"));
assertEquals(2, exec("byte x = (byte)1; def y = (char)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (char)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (char)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (char)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (char)1; return x << y"));
assertEquals(2, exec("byte x = (byte)1; def y = (int)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (int)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (int)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (int)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (int)1; return x << y"));
assertEquals(2, exec("byte x = (byte)1; def y = (long)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (long)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (long)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (long)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (long)1; return x << y"));
assertEquals(2, exec("byte x = (byte)1; def y = (byte)1; return x << y"));
assertEquals(2, exec("short x = (short)1; def y = (short)1; return x << y"));
assertEquals(2, exec("char x = (char)1; def y = (char)1; return x << y"));
assertEquals(2, exec("int x = (int)1; def y = (int)1; return x << y"));
assertEquals(2L, exec("long x = (long)1; def y = (long)1; return x << y"));
}
public void testLshDefTypedRHS() {
assertEquals(2, exec("def x = (byte)1; byte y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (short)1; byte y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (char)1; byte y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (int)1; byte y = (byte)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; byte y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; short y = (short)1; return x << y"));
assertEquals(2, exec("def x = (short)1; short y = (short)1; return x << y"));
assertEquals(2, exec("def x = (char)1; short y = (short)1; return x << y"));
assertEquals(2, exec("def x = (int)1; short y = (short)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; short y = (short)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; char y = (char)1; return x << y"));
assertEquals(2, exec("def x = (short)1; char y = (char)1; return x << y"));
assertEquals(2, exec("def x = (char)1; char y = (char)1; return x << y"));
assertEquals(2, exec("def x = (int)1; char y = (char)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; char y = (char)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; int y = (int)1; return x << y"));
assertEquals(2, exec("def x = (short)1; int y = (int)1; return x << y"));
assertEquals(2, exec("def x = (char)1; int y = (int)1; return x << y"));
assertEquals(2, exec("def x = (int)1; int y = (int)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; int y = (int)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; long y = (long)1; return x << y"));
assertEquals(2, exec("def x = (short)1; long y = (long)1; return x << y"));
assertEquals(2, exec("def x = (char)1; long y = (long)1; return x << y"));
assertEquals(2, exec("def x = (int)1; long y = (long)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; long y = (long)1; return x << y"));
assertEquals(2, exec("def x = (byte)1; byte y = (byte)1; return x << y"));
assertEquals(2, exec("def x = (short)1; short y = (short)1; return x << y"));
assertEquals(2, exec("def x = (char)1; char y = (char)1; return x << y"));
assertEquals(2, exec("def x = (int)1; int y = (int)1; return x << y"));
assertEquals(2L, exec("def x = (long)1; long y = (long)1; return x << y"));
}
public void testRshDef() {
assertEquals(2, exec("def x = (byte)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (byte)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (short)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (char)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (int)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (long)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; def y = (int)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; def y = (long)1; return x >> y"));
}
public void testRshDefTypeLHS() {
assertEquals(2, exec("byte x = (byte)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (byte)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (short)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (char)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (int)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (int)1; return x >> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (long)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (long)1; return x >> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (byte)1; return x >> y"));
assertEquals(2, exec("short x = (short)4; def y = (short)1; return x >> y"));
assertEquals(2, exec("char x = (char)4; def y = (char)1; return x >> y"));
assertEquals(2, exec("int x = (int)4; def y = (int)1; return x >> y"));
assertEquals(2L, exec("long x = (long)4; def y = (long)1; return x >> y"));
}
public void testRshDefTypedLHS() {
assertEquals(2, exec("def x = (byte)4; byte y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; byte y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; byte y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; byte y = (byte)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; byte y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; short y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; short y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; short y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; short y = (short)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; short y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; char y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; char y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; char y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; char y = (char)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; char y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; int y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; int y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; int y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; int y = (int)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; int y = (int)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; long y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; long y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; long y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; long y = (long)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; long y = (long)1; return x >> y"));
assertEquals(2, exec("def x = (byte)4; byte y = (byte)1; return x >> y"));
assertEquals(2, exec("def x = (short)4; short y = (short)1; return x >> y"));
assertEquals(2, exec("def x = (char)4; char y = (char)1; return x >> y"));
assertEquals(2, exec("def x = (int)4; int y = (int)1; return x >> y"));
assertEquals(2L, exec("def x = (long)4; long y = (long)1; return x >> y"));
}
public void testUshDef() {
assertEquals(2, exec("def x = (byte)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (byte)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (short)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (char)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (int)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (long)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; def y = (int)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; def y = (long)1; return x >>> y"));
}
public void testUshDefTypedLHS() {
assertEquals(2, exec("byte x = (byte)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (byte)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (short)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (char)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (int)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (int)1; return x >>> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (long)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (long)1; return x >>> y"));
assertEquals(2, exec("byte x = (byte)4; def y = (byte)1; return x >>> y"));
assertEquals(2, exec("short x = (short)4; def y = (short)1; return x >>> y"));
assertEquals(2, exec("char x = (char)4; def y = (char)1; return x >>> y"));
assertEquals(2, exec("int x = (int)4; def y = (int)1; return x >>> y"));
assertEquals(2L, exec("long x = (long)4; def y = (long)1; return x >>> y"));
}
public void testUshDefTypedRHS() {
assertEquals(2, exec("def x = (byte)4; byte y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; byte y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; byte y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; byte y = (byte)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; byte y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; short y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; short y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; short y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; short y = (short)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; short y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; char y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; char y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; char y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; char y = (char)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; char y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; int y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; int y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; int y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; int y = (int)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; int y = (int)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; long y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; long y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; long y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; long y = (long)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; long y = (long)1; return x >>> y"));
assertEquals(2, exec("def x = (byte)4; byte y = (byte)1; return x >>> y"));
assertEquals(2, exec("def x = (short)4; short y = (short)1; return x >>> y"));
assertEquals(2, exec("def x = (char)4; char y = (char)1; return x >>> y"));
assertEquals(2, exec("def x = (int)4; int y = (int)1; return x >>> y"));
assertEquals(2L, exec("def x = (long)4; long y = (long)1; return x >>> y"));
}
public void testBogusDefShifts() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; def y = 2F; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; def y = 2D; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; def y = 2; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; def y = 2L; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; def y = 2F; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; def y = 2D; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; def y = 2; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; def y = 2L; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; def y = 2F; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; def y = 2D; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; def y = 2; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; def y = 2L; return x >>> y;");
});
}
public void testBogusDefShiftsTypedLHS() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("long x = 1L; def y = 2F; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1; def y = 2D; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; def y = 2; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; def y = 2L; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("long x = 1L; def y = 2F; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1; def y = 2D; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; def y = 2; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; def y = 2L; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("long x = 1L; def y = 2F; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1; def y = 2D; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; def y = 2; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; def y = 2L; return x >>> y;");
});
}
public void testBogusDefShiftsTypedRHS() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; float y = 2F; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; double y = 2D; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; int y = 2; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; long y = 2L; return x << y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; float y = 2F; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; double y = 2D; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; int y = 2; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; long y = 2L; return x >> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; float y = 2F; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; double y = 2D; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1F; int y = 2; return x >>> y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1D; long y = 2L; return x >>> y;");
});
}
public void testLshCompoundAssignment() {
// byte
assertEquals((byte) 60, exec("byte x = 15; x <<= 2; return x;"));
assertEquals((byte) -60, exec("byte x = (byte) -15; x <<= 2; return x;"));
// short
assertEquals((short) 60, exec("short x = 15; x <<= 2; return x;"));
assertEquals((short) -60, exec("short x = (short) -15; x <<= 2; return x;"));
// char
assertEquals((char) 60, exec("char x = (char) 15; x <<= 2; return x;"));
// int
assertEquals(60, exec("int x = 15; x <<= 2; return x;"));
assertEquals(-60, exec("int x = -15; x <<= 2; return x;"));
// long
assertEquals(60L, exec("long x = 15L; x <<= 2; return x;"));
assertEquals(-60L, exec("long x = -15L; x <<= 2; return x;"));
// long shift distance
assertEquals(60, exec("int x = 15; x <<= 2L; return x;"));
assertEquals(-60, exec("int x = -15; x <<= 2L; return x;"));
}
public void testRshCompoundAssignment() {
// byte
assertEquals((byte) 15, exec("byte x = 60; x >>= 2; return x;"));
assertEquals((byte) -15, exec("byte x = (byte) -60; x >>= 2; return x;"));
// short
assertEquals((short) 15, exec("short x = 60; x >>= 2; return x;"));
assertEquals((short) -15, exec("short x = (short) -60; x >>= 2; return x;"));
// char
assertEquals((char) 15, exec("char x = (char) 60; x >>= 2; return x;"));
// int
assertEquals(15, exec("int x = 60; x >>= 2; return x;"));
assertEquals(-15, exec("int x = -60; x >>= 2; return x;"));
// long
assertEquals(15L, exec("long x = 60L; x >>= 2; return x;"));
assertEquals(-15L, exec("long x = -60L; x >>= 2; return x;"));
// long shift distance
assertEquals(15, exec("int x = 60; x >>= 2L; return x;"));
assertEquals(-15, exec("int x = -60; x >>= 2L; return x;"));
}
public void testUshCompoundAssignment() {
// byte
assertEquals((byte) 15, exec("byte x = 60; x >>>= 2; return x;"));
assertEquals((byte) -15, exec("byte x = (byte) -60; x >>>= 2; return x;"));
// short
assertEquals((short) 15, exec("short x = 60; x >>>= 2; return x;"));
assertEquals((short) -15, exec("short x = (short) -60; x >>>= 2; return x;"));
// char
assertEquals((char) 15, exec("char x = (char) 60; x >>>= 2; return x;"));
// int
assertEquals(15, exec("int x = 60; x >>>= 2; return x;"));
assertEquals(-60 >>> 2, exec("int x = -60; x >>>= 2; return x;"));
// long
assertEquals(15L, exec("long x = 60L; x >>>= 2; return x;"));
assertEquals(-60L >>> 2, exec("long x = -60L; x >>>= 2; return x;"));
// long shift distance
assertEquals(15, exec("int x = 60; x >>>= 2L; return x;"));
assertEquals(-60 >>> 2, exec("int x = -60; x >>>= 2L; return x;"));
}
public void testBogusCompoundAssignment() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("long x = 1L; float y = 2; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1; double y = 2L; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; int y = 2; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; int y = 2L; x <<= y;");
});
}
public void testBogusCompoundAssignmentConst() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1L; x <<= 2F;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("int x = 1L; x <<= 2.0;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; x <<= 2;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; x <<= 2L;");
});
}
public void testBogusCompoundAssignmentDef() {
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1L; float y = 2; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("def x = 1; double y = 2L; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("float x = 1F; def y = 2; x <<= y;");
});
expectScriptThrows(ClassCastException.class, ()-> {
exec("double x = 1D; def y = 2L; x <<= y;");
});
}
}