blob: c8604ab2c4b0f54aae6026d71cf0bcdfb76e687d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.lib.v8debug.client.cmdline;
import java.io.IOException;
import java.io.InputStream;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.netbeans.lib.v8debug.V8Command;
import org.netbeans.lib.v8debug.V8Event;
import org.netbeans.lib.v8debug.V8Response;
import org.netbeans.lib.v8debug.commands.SetBreakpoint;
/**
*
* @author Martin Entlicher
*/
public class V8ECMAScript6Test extends AbstractTestBase {
private static final String NODE_ARG_DBG = "--debug-brk"; // NOI18N
private static final String TEST_STABLE_FILE = "es6/TestECMAScript6_V8Stable.js"; // NOI18N
private static final String TEST_ARROWS_FILE = "es6/TestECMAScript6_Arrows.js"; // NOI18N
private static final String TEST_CLASSES_FILE = "es6/TestECMAScript6_Classes.js"; // NOI18N
private static final String NODE_ARG_ARROWS = "--harmony_arrow_functions"; // NOI18N
private static final String NODE_ARG_CLASSES = "--harmony_classes"; // NOI18N
private static final int LINE_BRKP_VAR_TYPES = 47;//71;
public V8ECMAScript6Test() {
}
@BeforeClass
public static void setUpClass() {
// To block standard in:
System.setIn(new InputStream() {
@Override
public int read() throws IOException {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException ex) {
throw new IOException(ex.getLocalizedMessage());
}
return -1;
}
});
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() throws IOException {
}
@After
public void tearDown() throws InterruptedException {
Thread.sleep(2000); // To recover
if (nodeProcess != null) {
nodeProcess.destroy();
}
}
@Test
public void testStable() throws IOException, InterruptedException {
startUp(V8DebugTest.class.getResourceAsStream(TEST_STABLE_FILE), TEST_STABLE_FILE, NODE_ARG_DBG);
// Wait to stop first:
V8Event lastEvent;
do {
lastEvent = responseHandler.getLastEvent();
} while (lastEvent.getKind() != V8Event.Kind.Break);
V8Response lastResponse = responseHandler.getLastResponse();
// V8Debug.TestAccess.doCommand(v8dbg, "stop at "+testFilePath+":"+LINE_BRKP_VAR_TYPES);
// lastResponse = responseHandler.getLastResponse();
// assertEquals(V8Command.Setbreakpoint, lastResponse.getCommand());
// checkBRResponse((SetBreakpoint.ResponseBody) lastResponse.getBody(), 2, testFilePath, LINE_BRKP_VAR_TYPES-1, -1, 0);
// Get unknown values when stopped on breakpoint. Doing next instead...
V8Debug.TestAccess.doCommand(v8dbg, "next 15");
responseHandler.getLastResponse();
// Start testing:
checkVarTypes();
V8Debug.TestAccess.doCommand(v8dbg, "next 4");
responseHandler.getLastResponse();
checkLocalVar("n", 10l, false);
checkLocalVar("ts", "The n = 10.", false);
checkLocalVar("ts2", "Multi\n" +
"line\n" +
"String", false);
//checkFrame(0, LINE_BEGIN-1, "var glob_n = 100;");
V8Debug.TestAccess.doCommand(v8dbg, "cont");
lastResponse = responseHandler.getLastResponse();
assertEquals(V8Command.Continue, lastResponse.getCommand());
}
private void checkVarTypes() throws IOException, InterruptedException {
checkLocalVar("set", new ES6TypesCheck("set", "#<Set>"), false);
checkLocalVar("map", new ES6TypesCheck("map", "#<Map>"), false);
checkLocalVar("symbol", new ES6TypesCheck("symbol", "Symbol(symbolKey)"), false);
checkLocalVar("promise", new ES6TypesCheck("promise", "#<Promise>"), false);
checkEval("set", new ES6TypesCheck("set", "#<Set>"));
checkEval("weakSet", new ES6TypesCheck("set", "#<WeakSet>"));
checkEval("weakMap", new ES6TypesCheck("map", "#<WeakMap>"));
checkEval("iter", new ObjectCheck("Array Iterator", null, null, "#<Object>"));
//checkEval("iter", new ES6TypesCheck("iterator", "#<Iterator>"));
checkEval("it1.value", new ObjectCheck("Array", null, null, "#<Array>"));
checkEval("gen", new FunctionCheck("",
"gen",
"function* () {\n var pre = 0, cur = 1;\n for (;;) {\n var temp = pre;\n pre = cur;\n cur += temp;\n yield cur;\n }\n }",
testFilePath, 76,
2699, 57, 19,
null, null));
}
@Test
public void testClasses() throws IOException, InterruptedException {
startUp(V8DebugTest.class.getResourceAsStream(TEST_CLASSES_FILE),
TEST_CLASSES_FILE,
new String[] { NODE_ARG_DBG, NODE_ARG_CLASSES });
// Wait to stop first:
V8Event lastEvent;
do {
lastEvent = responseHandler.getLastEvent();
} while (lastEvent.getKind() != V8Event.Kind.Break);
V8Response lastResponse = responseHandler.getLastResponse();
V8Debug.TestAccess.doCommand(v8dbg, "next 5");
responseHandler.getLastResponse();
checkLocalVar("p", new ObjectCheck("Object",
new String[] { "x", "y" },
new Object[] { 15l, 25l },
"#<Point>"), false);
}
@Test
public void testArrows() throws IOException, InterruptedException {
startUp(V8DebugTest.class.getResourceAsStream(TEST_ARROWS_FILE),
TEST_ARROWS_FILE,
new String[] { NODE_ARG_DBG, NODE_ARG_ARROWS });
// Wait to stop first:
V8Event lastEvent;
do {
lastEvent = responseHandler.getLastEvent();
} while (lastEvent.getKind() != V8Event.Kind.Break);
V8Response lastResponse = responseHandler.getLastResponse();
V8Debug.TestAccess.doCommand(v8dbg, "next 4");
responseHandler.getLastResponse();
// V8Debug.TestAccess.doCommand(v8dbg, "stop at "+testFilePath+":"+50);
// lastResponse = responseHandler.getLastResponse();
// assertEquals(V8Command.Setbreakpoint, lastResponse.getCommand());
// checkBRResponse((SetBreakpoint.ResponseBody) lastResponse.getBody(), 2, testFilePath, 50-1, -1, 0);
checkLocalVar("arrow", new FunctionCheck("", "f", "f => f + 1",
testFilePath, 76,
2192, 42, 12,
null, null), false);
checkLocalVar("cat", "abc", false);
V8Debug.TestAccess.doCommand(v8dbg, "stop at "+testFilePath+":"+53);
lastResponse = responseHandler.getLastResponse();
assertEquals(V8Command.Setbreakpoint, lastResponse.getCommand());
checkBRResponse((SetBreakpoint.ResponseBody) lastResponse.getBody(), 2, testFilePath, 53-1, null, 4);
checkLocalVar("cat", "abc", false);
V8Debug.TestAccess.doCommand(v8dbg, "c");
lastResponse = responseHandler.getLastResponse();
checkLocalVar("elem", "a", true);
V8Debug.TestAccess.doCommand(v8dbg, "next");
responseHandler.getLastResponse();
checkEval("cat", "bc");
}
}