/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package nashornproblems;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import jdk.nashorn.api.scripting.JSObject;

/**
 *
 * @author Jaroslav Tulach <jtulach@netbeans.org>
 */
public class ArraysTest {
    private static final ScriptEngine ENG;
    static {
        ScriptEngineManager sem = new ScriptEngineManager();
        ENG = sem.getEngineByMimeType("text/javascript");
        ENG.getClass();
    }
    
    static final JSObject allocJS;
    static final JSObject arraySize;
    static {
        try {
            allocJS = (JSObject) ENG.eval("(function(cnt) {" +
                    "var arr = new Array(cnt);\n" +
                    "for (var i = 0; i < cnt; i++) arr[i] = new Object();\n" +
                    "return arr;\n"
                    + "})"
            );  
            arraySize = (JSObject) ENG.eval("(function(arr, to) {\n"
                    + "if (to === null) {\n"
                    + "  if (Object.prototype.toString.call(arr) === '[object Array]') return arr.length;\n"
                    + "  else return -1;\n"
                    + "} else {\n"
                    + "  var l = arr.length;\n"
                    + "  for (var i = 0; i < l; i++) to[i] = arr[i];\n"
                    + "  return l;\n"
                    + "}})"
                );
        } catch (ScriptException ex) {
            throw new IllegalStateException(ex);
        }
    }
    
    public static void main(String... args) {
        System.err.println("name: " + System.getProperty("java.vm.name"));
        System.err.println("spec: " + System.getProperty("java.specification.version"));
        System.err.println("spec: " + System.getProperty("java.specification.version"));
        System.err.println("vendor: " + System.getProperty("java.vm.vendor"));
        System.err.println("version: " + System.getProperty("java.vm.version"));
        Object ret = allocJS.call(ArraysTest.class, 128);
        Object size = arraySize.call(ArraysTest.class, ret, null);
        if (!(size instanceof Number)) {
            throw new IllegalStateException("Not a number: " + size);
        }
        if (((Number)size).intValue() != 128) {
            throw new IllegalStateException("Expecting 128: " + size);
        }
    }
    
}
