8037572: Add more test cases to check static types

Reviewed-by: attila, lagergren
This commit is contained in:
Matherey Nunez 2014-05-05 14:17:20 +02:00
parent 2f01820f6d
commit 31c5e7065a
10 changed files with 406 additions and 67 deletions

View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8036987, 8037572
* @summary Implement tests that checks static types in the compiled code
* @run
*/
var inspect = Java.type("jdk.nashorn.test.tools.StaticTypeInspector").inspect
var a = 3, b, c;
var x = { a: 2, b:1, c: 7, d: -1}
var y = { a: Number.MAX_VALUE, b: Number.POSITIVE_INFINITY, c: "Hello", d: undefined}
// Testing arithmetic operators
//-- Local variable
print(inspect(x.a*x.b, "local int multiplication by local int"))
print(inspect(x.a/x.b, "local int division by local int without remainder"))
print(inspect(x.c/x.a, "local int division by local int with remainder"))
print(inspect(x.c%x.a, "local int modulo by local int"))
print(inspect(x.a+x.b, "local int addition local int"))
print(inspect(x.a-x.b, "local int substraction local int"))
print(inspect(y.a*y.a, "max value multiplication by max value"))
print(inspect(y.b*y.b, "infinity multiplication by infinity"))
print(inspect(x.d/y.b, "-1 division by infinity"))
print(inspect(y.b/x.e, "infinity division by zero"))
print(inspect(y.b/y.c, "infinity division by String"))
print(inspect(y.d/y.d, "local undefined division by local undefined"))
print(inspect(y.d*y.d, "local undefined multiplication by local undefined"))
print(inspect(y.d+x.a, "local undefined addition local int"))
print(inspect(y.d--, "local undefined decrement postfix"))
print(inspect(--y.d, "local undefined decrement prefix"))
print(inspect(x.a++, "local int increment postfix"))
print(inspect(++x.a, "local int increment prefix"))
print(inspect(x.a--, "local int decrement postfix"))
print(inspect(--x.a, "local int decrement prefix"))
print(inspect(+x.a, "local int unary plus"))
print(inspect(-x.a, "local int unary minus"))
//-- Global variable
print(inspect(b*c, "undefined multiplication by undefined"))
print(inspect(b/c, "undefined division by undefined"))
print(inspect(a+a, "global int addition global int"))
print(inspect(a-a, "global int substraction global int"))
print(inspect(a*a, "global int multiplication by global int"))
print(inspect(a++, "global int increment postfix"))
print(inspect(++a, "global int increment prefix"))
print(inspect(a--, "global int decrement postfix"))
print(inspect(--a, "global int decrement prefix"))
print(inspect(+a, "global int unary plus"))
print(inspect(-a, "global int unary minus"))
print(inspect(b--, "global undefined decrement postfix"))
print(inspect(--b, "global undefined decrement prefix"))
print(inspect(x, "object"))
print(inspect(x/x, "object division by object"))
print(inspect(x/y, "object division by object"))

View File

@ -0,0 +1,38 @@
local int multiplication by local int: int
local int division by local int without remainder: int
local int division by local int with remainder: double
local int modulo by local int: int
local int addition local int: int
local int substraction local int: int
max value multiplication by max value: double
infinity multiplication by infinity: double
-1 division by infinity: double
infinity division by zero: double
infinity division by String: double
local undefined division by local undefined: double
local undefined multiplication by local undefined: double
local undefined addition local int: double
local undefined decrement postfix: double
local undefined decrement prefix: double
local int increment postfix: int
local int increment prefix: int
local int decrement postfix: int
local int decrement prefix: int
local int unary plus: int
local int unary minus: int
undefined multiplication by undefined: double
undefined division by undefined: double
global int addition global int: int
global int substraction global int: int
global int multiplication by global int: int
global int increment postfix: int
global int increment prefix: int
global int decrement postfix: int
global int decrement prefix: int
global int unary plus: int
global int unary minus: int
global undefined decrement postfix: double
global undefined decrement prefix: double
object: object
object division by object: double
object division by object: double

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8036987, 8037572
* @summary Implement tests that checks static types in the compiled code
* @run
*/
var inspect = Java.type("jdk.nashorn.test.tools.StaticTypeInspector").inspect
var a = b = 3;
var c;
var x = { a: 2, b:1, c: 7, d: -1, e: 1}
var y = { a: undefined, b: undefined}
// Testing assignment operators
//-- Global variable
print(inspect(a=c, "global int assignment to global variable"))
print(inspect(a=b, "undefined assignment to global int"))
print(inspect(a=y.a, "global int assignment to undefined"))
print(inspect(a+=b, "undefined addition assignment to global int"))
print(inspect(b=b+b, "global int addition global int"))
print(inspect(b+= y.a, "global int addition assignment undefined"))
//--Local variable
print(inspect(x.a+= y.a, "local int addition assignment local undefined"))
print(inspect(x.b=y.a, "local int assignment to undefined"))
print(inspect(y.a+=y.a, "local undefined addition assignment local undefined"))
print(inspect(x.c-=x.d, "local int substraction assignment local int"))
print(inspect(x.c*=x.d, "local int multiplication assignment local int"))
print(inspect(x.c/=x.d, "local int division assignment local int"))
print(inspect(y.b=x.c, "local undefined assignment to local int"))
print(inspect(y.c=x.c, "local boolean assignment to local int"))

View File

@ -0,0 +1,14 @@
global int assignment to global variable: undefined
undefined assignment to global int: int
global int assignment to undefined: undefined
undefined addition assignment to global int: double
global int addition global int: int
global int addition assignment undefined: double
local int addition assignment local undefined: double
local int assignment to undefined: undefined
local undefined addition assignment local undefined: double
local int substraction assignment local int: int
local int multiplication assignment local int: int
local int division assignment local int: int
local undefined assignment to local int: int
local boolean assignment to local int: int

View File

@ -22,72 +22,78 @@
*/
/**
* JDK-8036987 : Implement tests that checks static types in the compiled code
* @test
* @bug 8036987, 8037572
* @summary Implement tests that checks static types in the compiled code
* @run
*/
var inspect = Java.type("jdk.nashorn.test.tools.StaticTypeInspector").inspect
var a=3,b,c,z,y;
var a=3, b=2.3, c=true, d;
var x = { a: 2, b:0, c:undefined}
var trees = new Array("redwood", "bay", "cedar", "oak");
// Testing arithmetic operators
print(inspect(y*z, "undefined value multiplication by undefined value"))
print(inspect(y/z, "undefined value division by undefined value"))
// Testing conditional operator
print(inspect("" ? b : x.a, "ternary operator"))
print(inspect(x.b ? b : x.a, "ternary operator"))
print(inspect(c ? b : a, "ternary operator"))
print(inspect(!c ? b : a, "ternary operator"))
print(inspect(d ? b : x.c, "ternary operator"))
print(inspect(x.c ? a : c, "ternary operator"))
print(inspect(c ? d : a, "ternary operator"))
print(inspect(c ? +a : b, "ternary operator"))
var x = { a: 2, b:1 }
print(inspect(x.a*x.b, "int multiplication by int"))
print(inspect(x.a/x.b, "int division by int without remainder"))
// Testing format methods
print(inspect(b.toFixed(2), "global double toFixed()"))
print(inspect(b.toPrecision(2)/1, "global double toPrecision() divided by 1"))
print(inspect(b.toExponential(2), "global double toExponential()"))
x.a = 7;
x.b = 2;
print(inspect(x.a/x.b, "int division by int with remainder"))
print(inspect(x.a%x.b, "int modulus by int"))
print(inspect(x.a+x.b, "int plus int"))
x.a = Number.MAX_VALUE;
x.b = Number.MAX_VALUE;
print(inspect(x.a*x.b, "max value multiplication by max value"))
x.a = Number.POSITIVE_INFINITY;
x.b = Number.POSITIVE_INFINITY;
print(inspect(x.a*x.b, "infinity multiplication by infinity"))
x.a = -1;
x.b = Number.POSITIVE_INFINITY;
print(inspect(x.a/x.b, "-1 division by infinity"))
x.a = Number.POSITIVE_INFINITY;
x.b = 0;
print(inspect(x.a/x.b, "infinity division by zero"))
x.a = Number.POSITIVE_INFINITY;
x.b = 'Hello';
print(inspect(x.a/x.b, "infinity division by String"))
// Testing arrays
print(inspect(trees[1], "member object"))
trees[1] = undefined;
print(inspect(trees[1], "member undefined"))
print(inspect(1 in trees ? b : a, "conditional on array member"))
delete trees[2]
print(inspect(2 in trees ? b : a, "conditional on array member"))
print(inspect(3 in trees ? trees[2]="bay" : a, "conditional on array member"))
print(inspect("oak" in trees ? b : a, "conditional on array member"))
// Testing nested functions and return value
function f() {
function f1() {
var x = 2, y = 1;
function g() {
print(inspect(x, "outer local variable"));
print(inspect(a, "global variable"));
print(inspect(x*y, "outer local variable multiplication by outer local variable"));
print(inspect(a*b, "global variable multiplication by global variable undefined"));
print(inspect(x*y, "outer local int multiplication by outer local int"));
print(inspect(a*d, "global int multiplication by global undefined"));
}
g()
}
f()
function f1(a,b,c) {
d = (a+b) * c;
print(inspect(c, "c"));
print(inspect(a+b, "a+b"));
print(inspect(d, "d"));
}
f1()
function f2(a,b) {
d = a && b;
print(inspect(d, "d"));
function f2(a,b,c) {
g = (a+b) * c;
print(inspect(c, "local undefined"));
print(inspect(a+b, "local undefined addition local undefined"));
print(inspect(g, "local undefined multiplication by undefined"));
}
f2()
f2()
function f3(a,b) {
g = a && b;
print(inspect(g, "local undefined AND local undefined"));
print(inspect(c||g, "global true OR local undefined"));
}
f3()
function f4() {
var x = true, y = 0;
function g() {
print(inspect(x+y, "outer local true addition local int"));
print(inspect(a+x, "global int addition outer local true"));
print(inspect(x*y, "outer local true multiplication by outer local int"));
print(inspect(y*d, "outer local int multiplication by global undefined"));
}
g()
}
f4()

View File

@ -1,20 +1,30 @@
undefined value multiplication by undefined value: double
undefined value division by undefined value: double
int multiplication by int: int
int division by int without remainder: int
int division by int with remainder: double
int modulus by int: int
int plus int: int
max value multiplication by max value: double
infinity multiplication by infinity: double
-1 division by infinity: double
infinity division by zero: double
infinity division by String: double
ternary operator: int
ternary operator: int
ternary operator: double
ternary operator: int
ternary operator: undefined
ternary operator: boolean
ternary operator: undefined
ternary operator: int
global double toFixed(): object
global double toPrecision() divided by 1: double
global double toExponential(): object
member object: object
member undefined: undefined
conditional on array member: double
conditional on array member: int
conditional on array member: object
conditional on array member: int
outer local variable: int
global variable: int
outer local variable multiplication by outer local variable: int
global variable multiplication by global variable undefined: double
c: undefined
a+b: double
d: double
d: undefined
outer local int multiplication by outer local int: int
global int multiplication by global undefined: double
local undefined: undefined
local undefined addition local undefined: double
local undefined multiplication by undefined: double
local undefined AND local undefined: undefined
global true OR local undefined: boolean
outer local true addition local int: double
global int addition outer local true: double
outer local true multiplication by outer local int: double
outer local int multiplication by global undefined: double

View File

@ -0,0 +1,65 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8036987, 8037572
* @summary Implement tests that checks static types in the compiled code
* @run
*/
var inspect = Java.type("jdk.nashorn.test.tools.StaticTypeInspector").inspect
var a = 3, b = true, c = 0;
var x = { a: 2, b: undefined, c: true}
// Testing logical operators
//-- Global variable
print(inspect("cat" && "dog", "object AND object"))
print(inspect(b && a, "true AND non-falsey global int"))
print(inspect(a && b, "non-falsey global int AND true"))
print(inspect(x && b, "non-falsey object AND true"))
print(inspect(b && x, "true AND non-falsey object"))
print(inspect("cat" || "dog", "object OR object"))
print(inspect(b || a, "true OR non-falsey global int"))
print(inspect(a || b, "non-falsey global int OR true"))
print(inspect(x || b, "non-falsey object OR true"))
print(inspect(b || x, "true OR non-falsey object"))
print(inspect(!x.c || b, "false OR true"))
print(inspect(c && b, "falsey global int AND true"))
print(inspect(c || x.b, "falsey global int OR undefined"))
print(inspect(!c || x.b, "logical not falsey global int OR undefined"))
print(inspect(!b || x.b, "false OR undefined"))
print(inspect(!b || c, "false OR falsey global int"))
print(inspect(!c || c, "logical not falsey global int OR falsey global int"))
//--Local variable
print(inspect(x.b && a, "local undefined AND non-falsey global int"))
print(inspect(b && x.b, "true AND local undefined"))
print(inspect(x.b && x.a, "local undefined AND non-falsey local int"))
print(inspect(x.b || b, "local undefined OR true"))
print(inspect(b || x.b, "true OR local undefined"))
print(inspect(x.a && x.c, "non-falsey local int AND true"))
print(inspect(x.c && x.a, "true AND non-falsey local int"))
print(inspect(x.c && !!x.a, "true AND double logical not non-falsey local int "))
print(inspect(!x.c && x.a, "false AND non-falsey local int"))
print(inspect(x.a || x.c, "non-falsey local int OR true"))
print(inspect(!x.c || x.c, "false OR true"))

View File

@ -0,0 +1,28 @@
object AND object: object
true AND non-falsey global int: int
non-falsey global int AND true: boolean
non-falsey object AND true: boolean
true AND non-falsey object: object
object OR object: object
true OR non-falsey global int: boolean
non-falsey global int OR true: int
non-falsey object OR true: object
true OR non-falsey object: boolean
false OR true: boolean
falsey global int AND true: int
falsey global int OR undefined: undefined
logical not falsey global int OR undefined: boolean
false OR undefined: undefined
false OR falsey global int: int
logical not falsey global int OR falsey global int: boolean
local undefined AND non-falsey global int: undefined
true AND local undefined: undefined
local undefined AND non-falsey local int: undefined
local undefined OR true: boolean
true OR local undefined: boolean
non-falsey local int AND true: boolean
true AND non-falsey local int: int
true AND double logical not non-falsey local int : boolean
false AND non-falsey local int: boolean
non-falsey local int OR true: int
false OR true: boolean

View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8035652,8037858
* @summary Implement tests that checks static types in the compiled code
* @run
*/
var inspect = Java.type("jdk.nashorn.test.tools.StaticTypeInspector").inspect
var a = b = c = 3;
//JDK-8035652
print(inspect(a/a, "global int division by global int"))
print(inspect(a%a, "global int modulus by global int"))
print(inspect(b+=b, "global int addition assignment global int"))
//JDK-8037858
print(inspect(b-=b, "global int substraction assignment global int"))
print(inspect(c*=a, "global int multiplication assignment global int"))
print(inspect(a/=a, "global int division assignment global int"))
print(inspect(c%=c, "global int modulo assignment global int"))

View File

@ -0,0 +1,7 @@
global int division by global int: int
global int modulus by global int: int
global int addition assignment global int: int
global int substraction assignment global int: int
global int multiplication assignment global int: int
global int division assignment global int: int
global int modulo assignment global int: int