NumberBoxingTest.java revision 1239:77609e069f9f
1/*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package jdk.nashorn.api.javaaccess.test;
27
28import static org.testng.AssertJUnit.assertEquals;
29import static org.testng.AssertJUnit.assertTrue;
30import javax.script.ScriptEngine;
31import javax.script.ScriptEngineManager;
32import javax.script.ScriptException;
33import org.testng.TestNG;
34import org.testng.annotations.AfterClass;
35import org.testng.annotations.BeforeClass;
36import org.testng.annotations.Test;
37
38/**
39 * @test
40 * @build jdk.nashorn.api.javaaccess.SharedObject jdk.nashorn.api.javaaccess.Person jdk.nashorn.api.javaaccess.NumberBoxingTest
41 * @run testng/othervm jdk.nashorn.api.javaaccess.NumberBoxingTest
42 */
43@SuppressWarnings("javadoc")
44public class NumberBoxingTest {
45
46    private static ScriptEngine e;
47    private static SharedObject o;
48
49    public static void main(final String[] args) {
50        TestNG.main(args);
51    }
52
53    @BeforeClass
54    public static void setUpClass() throws ScriptException {
55        final ScriptEngineManager m = new ScriptEngineManager();
56        e = m.getEngineByName("nashorn");
57        o = new SharedObject();
58        e.put("o", o);
59        e.eval("var SharedObject = Packages.jdk.nashorn.api.javaaccess.SharedObject;");
60    }
61
62    @AfterClass
63    public static void tearDownClass() {
64        e = null;
65        o = null;
66    }
67
68    // --------------------------------long
69    // tests------------------------------------
70    @Test
71    public void accessFieldLongBoxing() throws ScriptException {
72        e.eval("var p_long = o.publicLongBox;");
73        assertEquals(o.publicLongBox, e.get("p_long"));
74        e.eval("o.publicLongBox = 12;");
75        assertEquals(Long.valueOf(12), o.publicLongBox);
76    }
77
78    @Test
79    public void accessStaticFieldLongBoxing() throws ScriptException {
80        e.eval("var ps_long = SharedObject.publicStaticLongBox;");
81        assertEquals(SharedObject.publicStaticLongBox, e.get("ps_long"));
82        e.eval("SharedObject.publicStaticLongBox = 120;");
83        assertEquals(120L, SharedObject.publicStaticLongBox.longValue());
84    }
85
86    @Test
87    public void accessFinalFieldLongBoxing() throws ScriptException {
88        e.eval("var pf_long = o.publicFinalLongBox;");
89        assertEquals(o.publicFinalLongBox, e.get("pf_long"));
90        e.eval("o.publicFinalLongBox = 120;");
91        assertEquals(Long.valueOf(9377333334L), o.publicFinalLongBox);
92    }
93
94    @Test
95    public void accessStaticFinalFieldLongBoxing() throws ScriptException {
96        e.eval("var psf_long = SharedObject.publicStaticFinalLong;");
97        assertEquals(SharedObject.publicStaticFinalLong, e.get("psf_long"));
98        e.eval("SharedObject.publicStaticFinalLong = 120;");
99        assertEquals(8333333333333L, SharedObject.publicStaticFinalLong);
100    }
101
102    // --------------------------------int
103    // tests------------------------------------
104    @Test
105    public void accessFieldIntBoxing() throws ScriptException {
106        e.eval("var p_int = o.publicIntBox;");
107        assertEquals(o.publicIntBox, e.get("p_int"));
108        e.eval("o.publicIntBox = 14;");
109        assertEquals(Integer.valueOf(14), o.publicIntBox);
110    }
111
112    @Test
113    public void accessStaticFieldIntBoxing() throws ScriptException {
114        e.eval("var ps_int = SharedObject.publicStaticInt;");
115        assertEquals(SharedObject.publicStaticInt, e.get("ps_int"));
116        e.eval("SharedObject.publicStaticInt = 140;");
117        assertEquals(140, SharedObject.publicStaticInt);
118    }
119
120    @Test
121    public void accessFinalFieldIntBoxing() throws ScriptException {
122        e.eval("var pf_int = o.publicFinalIntBox;");
123        assertEquals(o.publicFinalIntBox, e.get("pf_int"));
124        e.eval("o.publicFinalIntBox = 10;");
125        assertEquals(Integer.valueOf(207512301), o.publicFinalIntBox);
126    }
127
128    @Test
129    public void accessStaticFinalFieldIntBoxing() throws ScriptException {
130        e.eval("var psf_int = SharedObject.publicStaticFinalInt;");
131        assertEquals(SharedObject.publicStaticFinalInt, e.get("psf_int"));
132        e.eval("SharedObject.publicStaticFinalInt = 140;");
133        assertEquals(207182023, SharedObject.publicStaticFinalInt);
134    }
135
136    // --------------------------------byte
137    // tests------------------------------------
138    @Test
139    public void accessFieldByteBoxing() throws ScriptException {
140        e.eval("var p_byte = o.publicByteBox;");
141        assertEqualsDouble(o.publicByteBox, "p_byte");
142        e.eval("o.publicByteBox = 16;");
143        assertEquals(Byte.valueOf((byte)16), o.publicByteBox);
144    }
145
146    @Test
147    public void accessStaticFieldByteBoxing() throws ScriptException {
148        e.eval("var ps_byte = SharedObject.publicStaticByte;");
149        assertEqualsDouble(SharedObject.publicStaticByte, "ps_byte");
150        e.eval("SharedObject.publicStaticByte = 16;");
151        assertEquals(16, SharedObject.publicStaticByte);
152    }
153
154    @Test
155    public void accessFinalFieldByteBoxing() throws ScriptException {
156        e.eval("var pf_byte = o.publicFinalByteBox;");
157        assertEqualsDouble(o.publicFinalByteBox, "pf_byte");
158        e.eval("o.publicFinalByteBox = 16;");
159        assertEquals(Byte.valueOf((byte)19), o.publicFinalByteBox);
160    }
161
162    @Test
163    public void accessStaticFinalFieldByteBoxing() throws ScriptException {
164        e.eval("var psf_byte = SharedObject.publicStaticFinalByte;");
165        assertEqualsDouble(SharedObject.publicStaticFinalByte, "psf_byte");
166        e.eval("SharedObject.publicStaticFinalByte = 16;");
167        assertEquals(-70, SharedObject.publicStaticFinalByte);
168    }
169
170    // --------------------------------short
171    // tests------------------------------------
172    @Test
173    public void accessFieldShortBoxing() throws ScriptException {
174        e.eval("var p_short = o.publicShortBox;");
175        assertEqualsDouble(o.publicShortBox, "p_short");
176        e.eval("o.publicShortBox = 18;");
177        assertEquals(Short.valueOf((short)18), o.publicShortBox);
178    }
179
180    private static void assertEqualsDouble(final Number n, final String name) {
181        assertEquals(n.doubleValue(), ((Number)e.get(name)).doubleValue());
182    }
183
184    @Test
185    public void accessStaticFieldShortBoxing() throws ScriptException {
186        e.eval("var ps_short = SharedObject.publicStaticShort;");
187        assertEqualsDouble(SharedObject.publicStaticShort, "ps_short");
188        e.eval("SharedObject.publicStaticShort = 180;");
189        assertEquals(180, SharedObject.publicStaticShort);
190    }
191
192    @Test
193    public void accessFinalFieldShortBoxing() throws ScriptException {
194        e.eval("var pf_short = o.publicFinalShortBox;");
195        assertEqualsDouble(o.publicFinalShortBox, "pf_short");
196        e.eval("o.publicFinalShortBox = 180;");
197        assertEquals(Short.valueOf((short)-26777), o.publicFinalShortBox);
198    }
199
200    @Test
201    public void accessStaticFinalFieldShortBoxing() throws ScriptException {
202        e.eval("var psf_short = SharedObject.publicStaticFinalShort;");
203        assertEqualsDouble(SharedObject.publicStaticFinalShort, "psf_short");
204        e.eval("SharedObject.publicStaticFinalShort = 180;");
205        assertEquals(8888, SharedObject.publicStaticFinalShort);
206    }
207
208    // --------------------------------char
209    // tests------------------------------------
210    @Test
211    public void accessFieldCharBoxing() throws ScriptException {
212        e.eval("var p_char = o.publicCharBox;");
213        assertEquals(o.publicCharBox, e.get("p_char"));
214        e.eval("o.publicCharBox = 'S';");
215        assertEquals(Character.valueOf('S'), o.publicCharBox);
216        e.eval("try {" +
217                "    o.publicCharBox = 'Big string';" +
218                "} catch(e) {" +
219                "    var isThrown = true;" +
220                "}");
221        assertEquals("Exception thrown", true, e.get("isThrown"));
222        assertEquals(Character.valueOf('S'), o.publicCharBox);
223    }
224
225    @Test
226    public void accessStaticFieldCharBoxing() throws ScriptException {
227        e.eval("var ps_char = SharedObject.publicStaticChar;");
228        assertEquals(SharedObject.publicStaticChar, e.get("ps_char"));
229        e.eval("SharedObject.publicStaticChar = 'Z';");
230        assertEquals('Z', SharedObject.publicStaticChar);
231    }
232
233    @Test
234    public void accessFinalFieldCharBoxing() throws ScriptException {
235        e.eval("var pf_char = o.publicFinalCharBox;");
236        assertEquals(o.publicFinalCharBox, e.get("pf_char"));
237        e.eval("o.publicFinalCharBox = 'S';");
238        assertEquals(Character.valueOf('F'), o.publicFinalCharBox);
239    }
240
241    @Test
242    public void accessStaticFinalFieldCharBoxing() throws ScriptException {
243        e.eval("var psf_char = SharedObject.publicStaticFinalChar;");
244        assertEquals(SharedObject.publicStaticFinalChar, e.get("psf_char"));
245        e.eval("SharedObject.publicStaticFinalChar = 'Z';");
246        assertEquals('K', SharedObject.publicStaticFinalChar);
247    }
248
249    // --------------------------------float
250    // tests------------------------------------
251    @Test
252    public void accessFieldFloatBoxing() throws ScriptException {
253        e.eval("var p_float = o.publicFloatBox;");
254        assertEqualsDouble(o.publicFloatBox, "p_float");
255        o.publicFloatBox = 0.0f / 0.0f;
256        assertEquals(true, e.eval("isNaN(o.publicFloatBox)"));
257        o.publicFloatBox = 1.0f / 0.0f;
258        assertEquals(true, e.eval("Number.POSITIVE_INFINITY === o.publicFloatBox"));
259        o.publicFloatBox = -1.0f / 0.0f;
260        assertEquals(true, e.eval("Number.NEGATIVE_INFINITY === o.publicFloatBox"));
261        e.eval("o.publicFloatBox = 20;");
262        assertEquals(20, o.publicFloatBox, 1e-10);
263        e.eval("o.publicFloatBox = 0.0/0.0;");
264        assertTrue(Float.isNaN(o.publicFloatBox));
265        e.eval("o.publicFloatBox = 1.0/0.0;");
266        assertEquals(Float.floatToIntBits(Float.POSITIVE_INFINITY), Float.floatToIntBits(o.publicFloatBox));
267        e.eval("o.publicFloatBox = -1.0/0.0;");
268        assertEquals(Float.NEGATIVE_INFINITY, o.publicFloatBox, 1e-10);
269    }
270
271    @Test
272    public void accessStaticFieldFloatBoxing() throws ScriptException {
273        e.eval("var ps_float = SharedObject.publicStaticFloat;");
274        assertEqualsDouble(SharedObject.publicStaticFloat, "ps_float");
275        SharedObject.publicStaticFloat = 0.0f / 0.0f;
276        assertEquals(true, e.eval("isNaN(SharedObject.publicStaticFloat)"));
277        SharedObject.publicStaticFloat = 1.0f / 0.0f;
278        assertEquals(true, e.eval("Number.POSITIVE_INFINITY === SharedObject.publicStaticFloat"));
279        SharedObject.publicStaticFloat = -1.0f / 0.0f;
280        assertEquals(true, e.eval("Number.NEGATIVE_INFINITY === SharedObject.publicStaticFloat"));
281        e.eval("SharedObject.publicStaticFloat = 20.0;");
282        assertEquals(20.0f, SharedObject.publicStaticFloat, 1e-10);
283        e.eval("SharedObject.publicStaticFloat = 0.0/0.0;");
284        assertTrue(Float.isNaN(SharedObject.publicStaticFloat));
285        e.eval("SharedObject.publicStaticFloat = 1.0/0.0;");
286        assertEquals(Float.floatToIntBits(Float.POSITIVE_INFINITY), Float.floatToIntBits(SharedObject.publicStaticFloat));
287        e.eval("SharedObject.publicStaticFloat = -1.0/0.0;");
288        assertEquals(Float.floatToIntBits(Float.NEGATIVE_INFINITY), Float.floatToIntBits(SharedObject.publicStaticFloat));
289    }
290
291    @Test
292    public void accessFinalFloatBoxing() throws ScriptException {
293        e.eval("var pf_float = o.publicFinalFloatBox;");
294        assertEqualsDouble(o.publicFinalFloatBox, "pf_float");
295        e.eval("o.publicFinalFloatBox = 20.0;");
296        assertEquals(1.372e4f, o.publicFinalFloatBox, 1e-10);
297    }
298
299    @Test
300    public void accessStaticFinalFieldFloatBoxing() throws ScriptException {
301        e.eval("var psf_float = SharedObject.publicStaticFinalFloat;");
302        assertEqualsDouble(SharedObject.publicStaticFinalFloat, "psf_float");
303        e.eval("SharedObject.publicStaticFinalFloat = 20.0;");
304        assertEquals(0.72e8f, SharedObject.publicStaticFinalFloat, 1e-10);
305    }
306
307    // --------------------------------double
308    // tests------------------------------------
309    @Test
310    public void accessFieldDoubleBoxing() throws ScriptException {
311        e.eval("var p_double = o.publicDoubleBox;");
312        assertEquals(o.publicDoubleBox, e.get("p_double"));
313        o.publicDoubleBox = 0.0 / 0.0;
314        assertEquals(true, e.eval("isNaN(o.publicDoubleBox)"));
315        o.publicDoubleBox = 1.0 / 0.0;
316        assertEquals(true, e.eval("Number.POSITIVE_INFINITY === o.publicDoubleBox"));
317        o.publicDoubleBox = -1.0 / 0.0;
318        assertEquals(true, e.eval("Number.NEGATIVE_INFINITY === o.publicDoubleBox"));
319        e.eval("o.publicDoubleBox = 30;");
320        assertEquals(Double.doubleToLongBits(30.0), Double.doubleToLongBits(o.publicDoubleBox));
321        e.eval("o.publicDoubleBox = 0.0/0.0;");
322        assertTrue(Double.isNaN(o.publicDoubleBox));
323        e.eval("o.publicDoubleBox = 1.0/0.0;");
324        assertEquals(Double.doubleToLongBits(Double.POSITIVE_INFINITY), Double.doubleToLongBits(o.publicDoubleBox));
325        e.eval("o.publicDoubleBox = -1.0/0.0;");
326        assertEquals(Double.doubleToLongBits(Double.NEGATIVE_INFINITY), Double.doubleToLongBits(o.publicDoubleBox));
327    }
328
329    @Test
330    public void accessStaticFieldDoubleBoxing() throws ScriptException {
331        e.eval("var ps_double = SharedObject.publicStaticDouble;");
332        assertEquals(SharedObject.publicStaticDouble, e.get("ps_double"));
333        SharedObject.publicStaticDouble = 0.0 / 0.0;
334        assertEquals(true, e.eval("isNaN(SharedObject.publicStaticDouble)"));
335        SharedObject.publicStaticDouble = 1.0 / 0.0;
336        assertEquals(true, e.eval("Number.POSITIVE_INFINITY === SharedObject.publicStaticDouble"));
337        SharedObject.publicStaticDouble = -1.0 / 0.0;
338        assertEquals(true, e.eval("Number.NEGATIVE_INFINITY === SharedObject.publicStaticDouble"));
339        e.eval("SharedObject.publicStaticDouble = 40.0;");
340        assertEquals(Double.doubleToLongBits(40.0), Double.doubleToLongBits(SharedObject.publicStaticDouble));
341        e.eval("SharedObject.publicStaticDouble = 0.0/0.0;");
342        assertTrue(Double.isNaN(SharedObject.publicStaticDouble));
343        e.eval("SharedObject.publicStaticDouble = 1.0/0.0;");
344        assertEquals(Double.doubleToLongBits(Double.POSITIVE_INFINITY), Double.doubleToLongBits(SharedObject.publicStaticDouble));
345        e.eval("SharedObject.publicStaticDouble = -1.0/0.0;");
346        assertEquals(Double.doubleToLongBits(Double.NEGATIVE_INFINITY), Double.doubleToLongBits(SharedObject.publicStaticDouble));
347    }
348
349    @Test
350    public void accessFinalFieldDoubleBoxing() throws ScriptException {
351        e.eval("var pf_double = o.publicFinalDoubleBox;");
352        assertEquals(o.publicFinalDoubleBox, e.get("pf_double"));
353        e.eval("o.publicFinalDoubleBox = 30.0;");
354        assertEquals(Double.doubleToLongBits(1.412e-12), Double.doubleToLongBits(o.publicFinalDoubleBox));
355    }
356
357    @Test
358    public void accessStaticFinalFieldDoubleBoxing() throws ScriptException {
359        e.eval("var psf_double = SharedObject.publicStaticFinalDouble;");
360        assertEquals(SharedObject.publicStaticFinalDouble, e.get("psf_double"));
361        e.eval("SharedObject.publicStaticFinalDouble = 40.0;");
362        assertEquals(Double.doubleToLongBits(1.8e12), Double.doubleToLongBits(SharedObject.publicStaticFinalDouble));
363    }
364
365}
366