2018-11-09 19:47:39 +01:00
/ *
2020-01-12 12:42:31 +01:00
* Copyright 2018 - 2020 Volker Berlin ( i - net software )
2018-11-09 19:47:39 +01:00
*
* Licensed 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 de.inetsoftware.jwebassembly.runtime ;
2020-04-24 20:56:28 +02:00
import static org.junit.Assume.assumeFalse ;
2018-11-09 19:47:39 +01:00
import java.util.ArrayList ;
import java.util.Collection ;
import org.junit.ClassRule ;
import org.junit.Test ;
import org.junit.runners.Parameterized.Parameters ;
2020-01-12 12:42:31 +01:00
import de.inetsoftware.jwebassembly.JWebAssembly ;
2018-11-09 19:47:39 +01:00
import de.inetsoftware.jwebassembly.ScriptEngine ;
import de.inetsoftware.jwebassembly.WasmRule ;
import de.inetsoftware.jwebassembly.api.annotation.Export ;
2020-04-24 20:56:28 +02:00
import de.inetsoftware.jwebassembly.web.JSObject ;
2018-11-09 19:47:39 +01:00
public class Exceptions extends AbstractBaseTest {
@ClassRule
public static WasmRule rule = new WasmRule ( TestClass . class ) ;
public Exceptions ( ScriptEngine script , String method , Object [ ] params ) {
super ( rule , script , method , params ) ;
}
@Parameters ( name = " {0}-{1} " )
public static Collection < Object [ ] > data ( ) {
ArrayList < Object [ ] > list = new ArrayList < > ( ) ;
2019-08-27 18:25:31 +02:00
for ( ScriptEngine script : ScriptEngine . testEngines ( ) ) {
2018-11-09 19:47:39 +01:00
addParam ( list , script , " simple " ) ;
2020-04-24 20:56:28 +02:00
addParam ( list , script , " simpleLong " ) ;
2019-03-09 13:22:40 +01:00
addParam ( list , script , " direct " ) ;
addParam ( list , script , " rethrow " ) ;
addParam ( list , script , " tryFinally " ) ;
2020-04-24 20:56:28 +02:00
addParam ( list , script , " tryFinally2 " ) ;
2019-03-09 13:22:40 +01:00
addParam ( list , script , " complex " ) ;
2020-04-24 20:56:28 +02:00
addParam ( list , script , " sync " ) ;
2020-04-10 21:27:29 +02:00
addParam ( list , script , " emptyCatch " ) ;
2018-11-09 19:47:39 +01:00
}
2019-06-17 19:00:16 +02:00
rule . setTestParameters ( list ) ;
2020-01-12 12:42:31 +01:00
rule . setProperty ( JWebAssembly . WASM_USE_EH , " true " ) ;
2018-11-09 19:47:39 +01:00
return list ;
}
@Test
public void test ( ) {
2020-04-24 20:56:28 +02:00
assumeFalse ( getScriptEngine ( ) . name ( ) . startsWith ( " SpiderMonkey " ) ) ; //TODO https://bugzilla.mozilla.org/show_bug.cgi?id=1335652
assumeFalse ( getScriptEngine ( ) . name ( ) . contains ( " Wat " ) ) ; //TODO Current Node version 8.1 has the wrong order of Event section but Wabt has already the right version
2018-11-09 19:47:39 +01:00
super . test ( ) ;
}
static class TestClass {
@Export
static int simple ( ) {
int r ;
try {
r = 5 / 0 ;
} catch ( Exception ex ) {
r = 2 ;
}
return r ;
}
2020-04-24 20:56:28 +02:00
@Export
static long simpleLong ( ) {
long r ;
try {
r = 5L / 0L ;
} catch ( Exception ex ) {
r = 2L ;
}
return r ;
}
2018-11-09 19:47:39 +01:00
@Export
static int direct ( ) {
try {
return 5 / 0 ;
} catch ( Exception ex ) {
return 2 ;
}
}
2019-03-09 13:22:40 +01:00
@Export
2020-04-24 20:56:28 +02:00
static String rethrow ( ) {
String msg = " ok " ;
try {
rethrowImpl ( ) ;
} catch ( Exception ex ) {
msg = ex . getMessage ( ) ;
}
return JSObject . domString ( msg ) ;
}
private static int rethrowImpl ( ) {
2019-03-09 13:22:40 +01:00
try {
return 5 / 0 ;
} catch ( Exception ex ) {
throw ex ;
}
}
@Export
static int tryFinally ( ) {
int v = 1 ;
try {
v + + ;
v = 5 / 0 ;
} finally {
v + + ;
return v ;
}
}
2020-04-24 20:56:28 +02:00
@Export
static int tryFinally2 ( ) {
int v = 1 ;
try {
v + + ;
} finally {
v + + ;
}
return v ;
}
2019-03-09 13:22:40 +01:00
@Export
static int complex ( ) {
int v = 1 ;
try {
if ( v = = 1 ) {
v + + ;
v = divNull ( ) ;
} else {
v + = 2 ;
}
} finally {
v + + ;
return v ;
}
}
private static int divNull ( ) {
return 5 / 0 ;
}
2019-03-10 18:32:26 +01:00
// a synchronized also add an try/finally internally
@Export
static int sync ( ) {
int v = 1 ;
Object monitor = new Object ( ) ;
synchronized ( monitor ) {
v + + ;
}
return v ;
}
2020-04-10 21:27:29 +02:00
@Export
static int emptyCatch ( ) {
int h = 127 ; // variable slot 0
try {
int i = h + 1 ; // variable slot 1
} catch ( NumberFormatException nfe ) { // reuse variable slot 1
// nothing
}
return h ;
}
2019-11-28 20:07:51 +01:00
// @Export
// static int multiCatch() {
// int r;
// try {
// r = 5 / 0;
// } catch(RuntimeException ex ) {
// r = 1;
// } catch(Exception ex ) {
// r = 2;
// }
// return r;
// }
2019-03-09 13:22:40 +01:00
// @Export
// static int npe() {
// Object obj = new NullPointerException();
// return 3;
// }
2018-11-09 19:47:39 +01:00
}
}