提交 e3969209 编写于 作者: S sogoel

8025113: Convert 7 tools TryWithResources tests to jtreg format

Reviewed-by: darcy, jjg
上级 0998b4f0
/*
* @test /nodynamiccopyright/
* @bug 8025113
* @author sogoel
* @summary Resources cannot be declared outside t-w-r block
* @compile/fail/ref=ResDeclOutsideTry.out -XDrawDiagnostics ResDeclOutsideTry.java
*/
public class ResDeclOutsideTry implements AutoCloseable {
ResDeclOutsideTry tr1;
ResDeclOutsideTry tr2 = new ResDeclOutsideTry();
String test1() {
try (tr1 = new ResDeclOutsideTry(); tr2;) {
}
}
}
ResDeclOutsideTry.java:14:17: compiler.err.expected: token.identifier
ResDeclOutsideTry.java:14:48: compiler.err.expected: token.identifier
2 errors
/*
* Copyright (c) 2010, 2013, 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 8025113
* @author sogoel
* @summary Resource creation in nested expressions
*/
/**
* This test checks for resource creation in nested expressions.
* test1() - Create 3 resource in nested new expressions, style 1
* test2() - Create 3 resource in nested new expressions, style 2
* test3() - Create 4 resources with resources as parameters: new expression; typeid & new expression
*/
public class ResInNestedExpr {
static final int expected = 5;
static int closed = 0;
static void closing(String clazz) {
closed++;
}
static void checkClosedCount() {
if (expected != closed) {
throw new RuntimeException("Did not find enough closed resources."
+ "Expected " + expected + ", but found " + closed);
}
}
/**
* The "expected output" is each class name gotten with getSimpleName() to unclutter things.
* Each test method returns a classname of the resource and that is compared with
* values in this array.
*/
static String[] expectedOutput = {
"aResource::bResource::cResource", //test1
"aResource::bResource::cResource&aResource::cResource", //test3
"aResource::bResource::cResource&aResource::cResource"}; //test2
static void compare(String s1, String s2) {
if (s1.compareTo(s2) != 0) {
throw new RuntimeException(s1 + "!=" + s2);
}
}
String test1() {
String ret = null;
try (bResource br = new bResource(new cResource());
aResource ar = new aResource(br)) {
ret = ar.getClass().getSimpleName() + "::" +
ar.getB().getClass().getSimpleName() + "::" +
ar.getB().getC().getClass().getSimpleName();
}
return ret;
}
String test2() {
String ret = null;
try (aResource ar = new aResource(new bResource(new cResource()), new cResource())) {
String abc = ar.getClass().getSimpleName() + "::" +
ar.getB().getClass().getSimpleName() + "::" +
ar.getB().getC().getClass().getSimpleName();
String ac = ar.getClass().getSimpleName() + "::" +
ar.getC().getClass().getSimpleName();
ret = abc + "&" + ac;
}
return ret;
}
String test3() {
String ret = null;
try (bResource br = new bResource(new cResource());
aResource ar = new aResource(br, new cResource())) {
String abc = ar.getClass().getSimpleName() + "::" +
ar.getB().getClass().getSimpleName() + "::" +
ar.getB().getC().getClass().getSimpleName();
String ac = ar.getClass().getSimpleName() + "::" +
ar.getC().getClass().getSimpleName();
ret = abc + "&" + ac;
}
return ret;
}
public static void main(String... args) {
ResInNestedExpr t = new ResInNestedExpr();
int eo = 0;
compare(expectedOutput[eo++], t.test1());
compare(expectedOutput[eo++], t.test3());
compare(expectedOutput[eo++], t.test2());
ResInNestedExpr.checkClosedCount();
}
/**
* A resource to implement AutoCloseable
* Contains two other resources as data items.
*/
static class aResource implements AutoCloseable {
bResource bR;
cResource cR;
public aResource() {
bR = null;
cR = null;
}
public aResource(bResource br) {
bR = br;
}
public aResource(cResource cr) {
cR = cr;
}
public aResource(bResource br, cResource cr) {
bR = br;
cR = cr;
}
public bResource getB() {
return bR;
}
public cResource getC() {
return cR;
}
@Override
public void close() {
ResInNestedExpr.closing(this.getClass().getName());
}
}
/**
* A resource to implement AutoCloseable
* Contains one other resources as a data item.
*/
static class bResource implements AutoCloseable {
cResource cR;
public bResource() {
cR = null;
}
public bResource(cResource cr) {
cR = cr;
}
public cResource getC() {
return cR;
}
@Override
public void close() {
ResInNestedExpr.closing(this.getClass().getName());
}
}
/** A resource to implement AutoCloseable */
static class cResource implements AutoCloseable {
public cResource() {
}
@Override
public void close() {
ResInNestedExpr.closing(this.getClass().getName());
}
}
}
/*
* @test /nodynamiccopyright/
* @bug 8025113
* @author sogoel
* @summary Resource var cannot have same name as local variable
* @compile/fail/ref=ResourceNameConflict.out -XDrawDiagnostics ResourceNameConflict.java
*/
/**
* Test methods and their description
* test1() - negative test - local variable used as test resource
* test2() - negative test - test resource already defined in an enclosing for statement
*/
public class ResourceNameConflict implements AutoCloseable {
static final String str = "asdf";
void test1() {
String tr = "A resource spec var cannot have same name as local var.";
try (ResourceNameConflict tr = new ResourceNameConflict()) {
}
}
void test2(String... strArray) {
for (String str : strArray) {
try (ResourceNameConflict str = new ResourceNameConflict()) {
}
}
}
@Override
public void close() {
}
}
ResourceNameConflict.java:21:35: compiler.err.already.defined: kindname.variable, tr, kindname.method, test1()
ResourceNameConflict.java:27:39: compiler.err.already.defined: kindname.variable, str, kindname.method, test2(java.lang.String...)
2 errors
/*
* @test /nodynamiccopyright/
* @bug 8025113
* @author sogoel
* @summary Redeclaration of resource variables
* @compile/fail/ref=ResourceRedecl.out -XDrawDiagnostics ResourceRedecl.java
*/
import java.io.*;
public class ResourceRedecl {
public void test() {
// compiler error if name of an exception param is redeclared within the Block of the catch clause as a local var;
// or as an exception param of a catch clause in a try statement;
// or as a resource in a try-with-resources statement
try {
} catch (Exception exParam1) {
Object exParam1 = new Object();
try (java.io.FileInputStream exParam1 = new java.io.FileInputStream("foo.txt")) {
Object exParam1 = new Object();
} catch (IOException exParam1) {
}
}
// compiler error if resource is redeclared within the try Block as a local var
// or as an exception param of a catch clause in a try statement
try (java.io.FileInputStream exParam2 = new java.io.FileInputStream("bar.txt")) {
Object exParam2 = new Object();
try (BufferedReader br = new BufferedReader(new FileReader("zee.txt"))) {
} catch (IOException exParam2) {
}
} catch (Exception ex) {
}
}
}
ResourceRedecl.java:19:20: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
ResourceRedecl.java:20:42: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
ResourceRedecl.java:21:24: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
ResourceRedecl.java:22:34: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
ResourceRedecl.java:29:20: compiler.err.already.defined: kindname.variable, exParam2, kindname.method, test()
ResourceRedecl.java:31:34: compiler.err.already.defined: kindname.variable, exParam2, kindname.method, test()
6 errors
/*
* Copyright (c) 2010, 2013, 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 8025113
* @author sogoel
* @summary Test shadowing of resource variable
*/
/*
* "...a variable declared in a resource specification
* may be shadowed (6.3.1) anywhere inside a class declaration nested
* within the Block of the try."
*/
public class ResourceShadow {
static final String str = "asdf"; //this is okay
/**
* Resource variable shadows switch and case variables
*/
String test1() {
String ret = null;
switch (str) {
case str: //this is okay
try (SilentCloseable str = new SilentCloseable()) {
SilentCloseable tr = new SilentCloseable(str);
ret = str.getClass().getSimpleName();
}
break;
default:
ret = "";
}
return ret;
}
/**
* Resource variable may be shadowed (6.3.1) anywhere inside a class
* declaration nested within the Block of the try
*/
String test2() {
String ret = null;
try (SilentCloseable str = new SilentCloseable()) {
class temp {
String str = "I am not a SilentCloseable";
public void printSTR() {
System.out.println(str);
}
public String getSTR() {
return str;
}
}
temp tmp = new temp();
SilentCloseable tr = new SilentCloseable(tmp.getSTR());
ret = tr.getMsg();
}
return ret;
}
public static void main(String... args) {
ResourceShadow t = new ResourceShadow();
if (t.test1().compareTo("SilentCloseable") != 0) {
throw new RuntimeException("FAIL-test1");
}
if (t.test2().compareTo("I am not a SilentCloseable") != 0) {
throw new RuntimeException("FAIL-test2");
}
}
}
class SilentCloseable implements AutoCloseable {
SilentCloseable testres = null;
String msg = "default";
@Override
public void close() {
}
public SilentCloseable() {
}
public SilentCloseable(String s) {
msg = s;
}
public SilentCloseable(SilentCloseable tr) {
testres = tr;
}
public String getMsg() {
return msg;
}
}
/*
* Copyright (c) 2010, 2013, 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 8025113
* @author sogoel
* @summary t-w-r completes abruptly if the initialization of resource completes abruptly
*/
import java.io.FileInputStream;
import java.io.IOException;
import java.io.File;
/*
* If the initialization of the resource completes abruptly because of a
* throw of a value V ... and the automatic ->closing of the resource completes normally,
* then the try-with-resources statement completes abruptly because of the throw of value V.
*/
public class TestTwr09 {
/**
* throw from ctor of nested resource
* Check first resource is not open.
*/
String test1() {
String ret = null;
try (ResCloseable tr = new ResCloseable(new ResCloseable("throw from inner resource ctor",3))) {
ret = "FAIL";
} catch (RuntimeException re) {
ret = re.getMessage();
}
return ret;
}
/**
* throw from ctor of 2nd resource.
* 1st resource, FileInputStream should be automatically closed.
*/
String test2() {
String ret = null;
byte[] buf = new byte[1];
try (java.io.ByteArrayInputStream tr = new java.io.ByteArrayInputStream(buf);
ResCloseable str = new ResCloseable("throw from inner resource ctor",3)) {
ret = "FAIL";
} catch (final IOException fe) {
ret = "FAIL test2";
} catch (RuntimeException re) {
ret = "PASS test2";
}
System.out.println("Ret = " + ret);
return ret;
}
public static void main(String... args) {
TestTwr09 t = new TestTwr09();
if (t.test1().compareTo("throw from inner resource ctor") != 0) {
throw new RuntimeException("FAIL-test1");
}
if (t.test2().compareTo("PASS test2") != 0) {
throw new RuntimeException("FAIL-test2");
}
}
}
/** a simple resource the implements AutoCloseable so it can be used
* in twr's resource specification block.
*/
class ResCloseable implements AutoCloseable {
ResCloseable testres = null;
String msg = "default";
boolean bOpen = false;
public ResCloseable() {
bOpen = true;
}
public ResCloseable(ResCloseable tr) {
bOpen = true;
msg = tr.getMsg();
}
public ResCloseable(String s) {
bOpen = true;
msg = s;
}
public ResCloseable(String msg, int c) {
bOpen = true;
if (c == 3) {
throw new RuntimeException(msg);
}
}
@Override
public void close() {
bOpen = false;
}
public boolean isOpen() {
return bOpen;
}
public String getMsg() {
return msg;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册