jaroslav@1965: /** jaroslav@1965: * Back 2 Browser Bytecode Translator jaroslav@1965: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@1965: * jaroslav@1965: * This program is free software: you can redistribute it and/or modify jaroslav@1965: * it under the terms of the GNU General Public License as published by jaroslav@1965: * the Free Software Foundation, version 2 of the License. jaroslav@1965: * jaroslav@1965: * This program is distributed in the hope that it will be useful, jaroslav@1965: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1965: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1965: * GNU General Public License for more details. jaroslav@1965: * jaroslav@1965: * You should have received a copy of the GNU General Public License jaroslav@1965: * along with this program. Look for COPYING file in the top folder. jaroslav@1965: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1965: */ jaroslav@1965: package org.apidesign.vm4brwsr; jaroslav@1965: jaroslav@1974: import net.java.html.js.JavaScriptBody; jaroslav@1972: import net.java.html.lib.Date; jaroslav@1971: import static net.java.html.lib.Exports.NaN; jaroslav@1966: import static net.java.html.lib.Exports.eval; jaroslav@1971: import static net.java.html.lib.Exports.isNaN; jaroslav@1970: import static net.java.html.lib.Exports.parseInt; jaroslav@1966: import net.java.html.lib.Objs; jaroslav@1965: jaroslav@1965: public class LibUse { jaroslav@1965: public static int fourtyTwo() { jaroslav@1966: Number n = (Number) eval("6 * 7"); jaroslav@1965: return n.intValue(); jaroslav@1965: } jaroslav@1966: jaroslav@1968: public static String hiProperty(String set) { jaroslav@1966: final Object obj = eval("var x = {}; x.x = 'Hi'; x"); jaroslav@1966: if (obj == null) { jaroslav@1966: throw new IllegalStateException("Some Value returned " + obj); jaroslav@1966: } jaroslav@1966: if (!(obj instanceof Objs)) { jaroslav@1966: throw new IllegalStateException("The result is Objs: " + obj.getClass()); jaroslav@1966: } jaroslav@1966: Objs js = (Objs) obj; jaroslav@1968: if (set != null) { jaroslav@1968: js.$set("x", set); jaroslav@1968: } jaroslav@1966: return (String) js.$get("x"); jaroslav@1966: } jaroslav@1970: jaroslav@1970: public static double parse(String str) throws Exception { jaroslav@1970: return parseInt(str); jaroslav@1970: } jaroslav@1970: jaroslav@1970: public static double parse(String str, int radix) throws Exception { jaroslav@1970: return parseInt(str, radix); jaroslav@1970: } jaroslav@1970: jaroslav@1971: public boolean checkNaN() throws Exception { jaroslav@1971: double nan = NaN; jaroslav@1971: return isNaN(nan); jaroslav@1971: } jaroslav@1971: jaroslav@1972: public double dateOperation() throws Exception { jaroslav@1972: Date eleven = new Date(2016, 1, 10); jaroslav@1972: return eleven.getFullYear() + eleven.getMonth(); jaroslav@1972: } jaroslav@1972: jaroslav@1974: public static double arrayForEach() throws Exception { jaroslav@1974: net.java.html.lib.Array arr = new net.java.html.lib.Array<>(); jaroslav@1974: assertNumber(arr.length.get(), 0.0, "Empty at first"); jaroslav@1974: arr.push(1.1, 2.2, 3); jaroslav@1974: assertNumber(arr.$get(0), 1.1, "1.1 is on position 0"); jaroslav@1974: assertNumber(arr.$get(1), 2.2, "2.2 is on position 1"); jaroslav@1974: assertNumber(arr.$get(2), 3.0, "3 is on position 2"); jaroslav@1974: final boolean[] called = { false }; jaroslav@1974: final double[] sum = { 0.0 }; jaroslav@1974: arr.forEach(new net.java.html.lib.Function.A1() { jaroslav@1974: @Override jaroslav@1974: public Void call(java.lang.Number p1) { jaroslav@1974: called[0] = true; jaroslav@1974: sum[0] += p1.doubleValue(); jaroslav@1974: return null; jaroslav@1974: } jaroslav@1974: jaroslav@1974: @Override jaroslav@1974: public Void call(Number p1, Object p2) { jaroslav@1974: return call(p1); jaroslav@1974: } jaroslav@1974: jaroslav@1974: @Override jaroslav@1974: public Void call(Number p1, Object p2, Object p3) { jaroslav@1974: return call(p1); jaroslav@1974: } jaroslav@1974: jaroslav@1974: @Override jaroslav@1974: public Void call(Number p1, Object p2, Object p3, Object p4) { jaroslav@1974: return call(p1); jaroslav@1974: } jaroslav@1974: jaroslav@1974: @Override jaroslav@1974: public Void call(Number p1, Object p2, Object p3, Object p4, Object p5) { jaroslav@1974: return call(p1); jaroslav@1974: } jaroslav@1974: }); jaroslav@1974: assertTrue(called[0], "forEach invoked"); jaroslav@1974: assertEquals(sum[0], 6.3, 0.1, "Sum computed"); jaroslav@1974: jaroslav@1974: return sum[0]; jaroslav@1974: } jaroslav@1974: jaroslav@1974: private static void assertEquals(double real, double expected, double delta, String msg) { jaroslav@1974: if (expected - delta < real && real < expected + delta) { jaroslav@1974: return; jaroslav@1974: } jaroslav@1974: raise(msg + " exp: " + expected + " but was: " + real); jaroslav@1974: } jaroslav@1974: jaroslav@1974: @JavaScriptBody(args = { "msg" }, body = "throw msg;") jaroslav@1974: private static native void raise(String msg); jaroslav@1974: jaroslav@1974: private static void assertNumber(Object value, double expected, String msg) { jaroslav@1974: if (value instanceof Number) { jaroslav@1974: assertEquals(((Number)value).doubleValue(), expected, 0.1, msg); jaroslav@1974: } else { jaroslav@1974: if (value == null) { jaroslav@1974: raise("null is not a number"); jaroslav@1974: return; jaroslav@1974: } jaroslav@1974: raise("Not a number: " + value + " type: " + value.getClass()); jaroslav@1974: } jaroslav@1974: } jaroslav@1974: jaroslav@1974: private static void assertTrue(boolean b, String msg) { jaroslav@1974: if (!b) { jaroslav@1974: raise(msg); jaroslav@1974: } jaroslav@1974: } jaroslav@1974: jaroslav@1965: }