| /* |
| * Copyright 2008 Google Inc. |
| * |
| * 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 com.google.gwt.core.client; |
| |
| import com.google.gwt.junit.client.GWTTestCase; |
| |
| /** |
| * Any JavaScript exceptions occurring within JSNI methods are wrapped as this |
| * class when caught in Java code. The wrapping does not occur until the |
| * exception passes out of JSNI into Java. Before that, the thrown object |
| * remains a native JavaScript exception object, and can be caught in JSNI as |
| * normal. |
| */ |
| public class JavaScriptExceptionTest extends GWTTestCase { |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.core.Core"; |
| } |
| |
| public void testJso() { |
| JavaScriptObject jso = makeJSO(); |
| try { |
| throwNative(jso); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertEquals("myName", e.getName()); |
| assertDescription(e, "myDescription"); |
| assertTrue(e.isThrownSet()); |
| assertSame(jso, e.getThrown()); |
| assertMessage(e); |
| } |
| } |
| |
| private static native JavaScriptObject makeJSO() /*-{ |
| return { |
| toString:function() { |
| return "jso"; |
| }, |
| name: "myName", |
| message: "myDescription", |
| extraField: "extraData" |
| }; |
| }-*/; |
| |
| public void testNull() { |
| try { |
| throwNative(null); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertEquals("null", e.getName()); |
| assertDescription(e, "null"); |
| assertTrue(e.isThrownSet()); |
| assertEquals(null, e.getThrown()); |
| assertMessage(e); |
| } |
| } |
| |
| public void testObject() { |
| Object o = new Object() { |
| @Override public String toString() { |
| return "myLameObject"; |
| } |
| }; |
| try { |
| throwNative(o); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertEquals(o.getClass().getName(), e.getName()); |
| assertDescription(e, "myLameObject"); |
| assertTrue(e.isThrownSet()); |
| assertEquals(o, e.getThrown()); |
| assertMessage(e); |
| } |
| } |
| |
| public void testString() { |
| try { |
| throwNative("foobarbaz"); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertEquals("String", e.getName()); |
| assertDescription(e, "foobarbaz"); |
| assertTrue(e.isThrownSet()); |
| assertEquals("foobarbaz", e.getThrown()); |
| assertMessage(e); |
| } |
| } |
| |
| public void testThrowable() { |
| Throwable t = new Throwable(); |
| try { |
| throwNative(t); |
| fail(); |
| } catch (Throwable e) { |
| assertSame(t, e); |
| } |
| } |
| |
| public void testJavaScriptException() { |
| JavaScriptException t = new JavaScriptException((Object) "foo"); |
| assertTrue(t.isThrownSet()); |
| try { |
| throwNative(t); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertSame(t, e); |
| } |
| |
| t = new JavaScriptException("exception message"); // Thrown is not set |
| assertFalse(t.isThrownSet()); |
| try { |
| throwNative(t); |
| fail(); |
| } catch (JavaScriptException e) { |
| assertSame(t, e); |
| } |
| } |
| |
| private static native void throwNative(Object e) /*-{ |
| throw e; |
| }-*/; |
| |
| private static void assertDescription(JavaScriptException e, String description) { |
| if (!GWT.isScript()) { |
| assertTrue("Should start with method name", |
| e.getDescription().startsWith( |
| "@com.google.gwt.core.client.JavaScriptExceptionTest::" |
| + "throwNative(Ljava/lang/Object;)")); |
| } |
| assertTrue("Should end with " + e.getDescription(), |
| e.getDescription().endsWith(description)); |
| } |
| |
| private static void assertMessage(JavaScriptException e) { |
| assertEquals("(" + e.getName() + ") " + e.getDescription(), e.getMessage()); |
| } |
| } |