/** * Copyright 2007-2015, Kaazing Corporation. All rights reserved. * * 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. */ // // TODO: Move back to Robot tests to test AST after visitor transformations. // package org.kaazing.k3po.lang.internal.parser; // // import static org.kaazing.k3po.lang.parser.v2.ScriptParseStrategy.SCRIPT; // import static org.junit.Assert.assertEquals; // // import java.io.ByteArrayInputStream; // import java.net.URI; // import java.nio.charset.StandardCharsets; // import java.util.Arrays; // import java.util.LinkedList; // import java.util.List; // import java.util.ListIterator; // // import javax.el.ExpressionFactory; // // import org.junit.Test; // import org.junit.runner.RunWith; // import org.junit.runners.Parameterized; // import org.junit.runners.Parameterized.Parameters; // // import org.kaazing.k3po.lang.ast.AstAcceptNode; // import org.kaazing.k3po.lang.ast.AstAcceptableNode; // import org.kaazing.k3po.lang.ast.AstScriptNode; // import org.kaazing.k3po.lang.ast.AstStreamNode; // import org.kaazing.k3po.lang.ast.builder.AstScriptNodeBuilder; // import org.kaazing.k3po.lang.el.ExpressionContext; // // @RunWith(Parameterized.class) public class ScriptParserImplParseSCRIPTTest { // // /* // * Uck named parameters breaks eclipse. Uncomment if your having trouble // * figuring figuring out which parameters were being used. // * @Parameters(name= "{index}: (parseWithStrat={0} cononicalize={1}") // */ // @Parameters // public static List<Object[]> createTestData() { // return Arrays.asList(new Object[][] { { true, true }, { false, true }, // { false, false } }); // } // // private final Boolean parseWithStrategy; // private final Boolean canonicalize; // // /** // * Return true if the result of parsing a script should result in a // * canonicalized script. // * @return // */ // public boolean isCanonicalizedScript() { // return canonicalize && !parseWithStrategy; // } // // public ScriptParserImplParseSCRIPTTest(Boolean parseWithStrategy, // Boolean canonicalize) { // this.parseWithStrategy = parseWithStrategy; // this.canonicalize = canonicalize; // } // // private AstScriptNode doParse(String script, ExpressionFactory factory, // ExpressionContext context) throws Exception { // return doParse(script, new ScriptParserImpl(factory, context)); // } // // private AstScriptNode doParse(String script) throws Exception { // return doParse(script, new ScriptParserImpl()); // } // // private AstScriptNode doParse(String script, ScriptParserImpl parser) // throws Exception { // // // parser.setOption("canonicalize", canonicalize.toString()); // // AstScriptNode result; // if (parseWithStrategy) { // result = parser.parseWithStrategy(script, SCRIPT); // // } else { // result = parser.parse(new ByteArrayInputStream(script.getBytes(StandardCharsets.UTF_8))); // } // return result; // } // // // @formatter:off // @Test // public void shouldParseConnectScript() // throws Exception { // // String script = "# tcp.client.connect-then-close\n" + // "connect tcp://localhost:7788\n" + // "connected\n" + // "close\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } // // assertEquals(expected, actual); // } // // @Test // public void shouldParseConnectScriptWithComments() // throws Exception { // // String script = "# tcp.client.connect-then-close\n" + // "connect tcp://localhost:7788 # Comment 1\n" + // "\t\t # Comment 2\n" + // "connected\n" + // "close\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addConnectedEvent() // .setNextLineInfo(2, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(2, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } // // assertEquals(expected, actual); // } // // @Test // public void shouldParseAcceptScript() // throws Exception { // // String script = // "# tcp.client.accept-then-close\n" + // "accept tcp://localhost:7788\n" + // "accepted\n" + // "connected\n" + // "close\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // // expected = transformScript(expected); // // } // // assertEquals(expected, actual); // } // // // @Test // public void shouldParseMultiConnectScript() // throws Exception { // // String script = // "# tcp.client.echo-multi-conn.upstream\n" + // "connect tcp://localhost:8785\n" + // "connected\n" + // "write \"Hello, world!\"\n" + // "write notify BARRIER\n" + // "close\n" + // "closed\n" + // "# tcp.client.echo-multi-conn.downstream\n" + // "connect tcp://localhost:8783\n" + // "connected\n" + // "read await BARRIER\n" + // "read \"Hello, world!\"\n" + // "close\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8785")) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addWriteNotifyBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8783")) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadAwaitBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8785")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addWriteNotifyBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8783")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadAwaitBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } // // // assertEquals(expected, actual); // } // // /* The parse actually decorates the AST. So we // * get different results depending what doParse does (canonicalize off and // * parseWithStrategy on causes the annotation. We need to expect different results // * in this case. // */ // @Test // public void shouldParseMultiAcceptScript() // throws Exception { // // String script = // "# tcp.server.echo-multi-conn.upstream\n" + // "accept tcp://localhost:8783\n" + // "accepted\n" + // "connected\n" + // "read await BARRIER\n" + // "read \"Hello, world!\"\n" + // "close\n" + // "closed\n" + // // "# tcp.server.echo-multi-conn.downstream\n" + // "accept tcp://localhost:8785\n" + // "accepted\n" + // "connected\n" + // "write \"Hello, world!\"\n" + // "write notify BARRIER\n" + // "close\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8783")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadAwaitBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8785")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addWriteNotifyBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8783")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadAwaitBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:8785")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactText("Hello, world!") // .done() // .addWriteNotifyBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // expected = transformScript(expected); // } // // assertEquals(expected, actual); // } // // @Test // public void shouldParseAcceptAndConnectScript() // throws Exception { // // String script = // "# tcp.server.accept-then-close\n" + // "accept tcp://localhost:7788\n" + // "accepted\n" + // "connected\n" + // "closed\n" + // "# tcp.client.connect-then-close\n" + // "connect tcp://localhost:7788\n" + // "connected\n" + // "close\n" + // "closed\n" // ; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } else { // expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .done() // .addAcceptedStream() // .setNextLineInfo(1, 0) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // // expected = transformScript(expected); // // } // // assertEquals(expected, actual); // } // // @Test // see http://jira.kaazing.wan/NR-35 // public void shouldParseNonClosingConnectScript() // throws Exception { // // String script = // "# tcp.client.non-closing\n" + // "connect tcp://localhost:7788\n" + // "connected\n" + // "read \"foo\"\n" + // "write [0x01 0x02 0xff]\n" + // "closed\n"; // // AstScriptNode actual = doParse(script); // AstScriptNode expected; // // if (!isCanonicalizedScript()) { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("foo") // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactBytes(new byte[] { 0x01, 0x02, (byte) 0xff}) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // // } else { // expected = new AstScriptNodeBuilder() // .addConnectStream() // .setNextLineInfo(2, 0) // .setLocation(URI.create("tcp://localhost:7788")) // .addOpenedEvent() // .setNextLineInfo(0, 0) // .done() // .addBoundEvent() // .setNextLineInfo(0, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadEvent() // .setNextLineInfo(1, 0) // .setExactText("foo") // .done() // .addReadNotifyBarrier() // .setBarrierName("~read~write~1") // .done() // .addWriteAwaitBarrier() // .setBarrierName("~read~write~1") // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactBytes(new byte[] { 0x01, 0x02, (byte) 0xff}) // .done() // .addDisconnectedEvent() // .setNextLineInfo(0, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(0, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // } // // assertEquals(expected, actual); // } // // @Test // public void shouldParseEmptyScript() // throws Exception { // // String script = ""; // // AstScriptNode actual = doParse(script); // // AstScriptNode expected = new AstScriptNodeBuilder() //// .setNextLineInfo(1, 0) // .done(); // // assertEquals(expected, actual); // } // // @Test // public void shouldParseScriptWithCommentsOnly() // throws Exception { // // String script = "# Comment 1\n" + // "# Comment 2\n" + // "# Comment 3\n"; // // AstScriptNode actual = doParse(script); // // AstScriptNode expected = new AstScriptNode(); // // assertEquals(expected, actual); // } // // @Test // public void shouldParseScriptWithCommentsAndWhitespace() // throws Exception { // // String script = "# Comment 1\n" + // "\t\n" + // " # Comment 2\n" + // "\r\n" + // "# Comment 3\n"; // // AstScriptNode actual = doParse(script); // // AstScriptNode expected = new AstScriptNode(); // // assertEquals(expected, actual); // } // // @Test // public void shouldParseScript() // throws Exception { // // /*TODO: This will fail because when canonicalized because the first unbound will // * fail because the state is not DISCONNECTED. However, I can't currently disconnect // * after a child open or child close. // */ // org.junit.Assume.assumeFalse(isCanonicalizedScript()); // // String script = // "#\n" + // "# server\n" + // "#\n" + // "accept tcp://localhost:8000 as ACCEPT\n" + // "opened\n" + // "bound\n" + // "child opened\n" + // "child closed\n" + // "unbound\n" + // "closed\n" + // "#\n" + // "# child\n" + // "#\n" + // " accepted ACCEPT\n" + // "opened\n" + // " bound\n" + // "connected\n" + // " read ([0..32]:input)\n" + // "read notify BARRIER\n" + // "write await BARRIER\n" + // "write [ 0x01 0xfe ]\n" + // "close\n" + // "disconnected\n" + // "unbound\n" + // "closed\n" + // "#\n" + // "# client\n" + // "#\n" + // "connect tcp://localhost:8000\n" + // " opened\n" + // "bound\n" + // " connected\n" + // "write ${input}\n" + // " read [ 0x00 0xff ]\n" + // "close\n" + // "disconnected\n" + // "unbound\n" + // "closed"; // // ExpressionFactory factory = ExpressionFactory.newInstance(); // ExpressionContext context = new ExpressionContext(); // // //parser.lex(new ByteArrayInputStream(script.getBytes(UTF_8))); // AstScriptNode actual = doParse(script, factory, context); // // AstScriptNode expected = new AstScriptNodeBuilder() // .addAcceptStream() // .setNextLineInfo(4, 0) // .setLocation(URI.create("tcp://localhost:8000")) // .setAcceptName("ACCEPT") // .addOpenedEvent() // .setNextLineInfo(1, 0) // .done() // .addBoundEvent() // .setNextLineInfo(1, 0) // .done() // .addChildOpenedEvent() // .setNextLineInfo(1, 0) // .done() // .addChildClosedEvent() // .setNextLineInfo(1, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addAcceptedStream() // .setNextLineInfo(4, 1) // .setAcceptName("ACCEPT") // .addOpenedEvent() // .setNextLineInfo(1, 0) // .done() // .addBoundEvent() // .setNextLineInfo(1, 1) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addReadEvent() // .setNextLineInfo(1, 1) // .setFixedLengthBytes(32, "input") // .done() // .addReadNotifyBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addWriteAwaitBarrier() // .setNextLineInfo(1, 0) // .setBarrierName("BARRIER") // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExactBytes(new byte[] { 0x01, -0x02 }) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .addConnectStream() // .setNextLineInfo(4, 0) // .setLocation(URI.create("tcp://localhost:8000")) // .addOpenedEvent() // .setNextLineInfo(1, 1) // .done() // .addBoundEvent() // .setNextLineInfo(1, 0) // .done() // .addConnectedEvent() // .setNextLineInfo(1, 1) // .done() // .addWriteCommand() // .setNextLineInfo(1, 0) // .setExpression(factory.createValueExpression(context, "${input}", byte[].class)) // .done() // .addReadEvent() // .setNextLineInfo(1, 1) // .setExactBytes(new byte[] { 0x00, -0x01 }) // .done() // .addCloseCommand() // .setNextLineInfo(1, 0) // .done() // .addDisconnectedEvent() // .setNextLineInfo(1, 0) // .done() // .addUnboundEvent() // .setNextLineInfo(1, 0) // .done() // .addClosedEvent() // .setNextLineInfo(1, 0) // .done() // .done() // .done(); // // assertEquals(expected, actual); // } // // @Test(expected = ScriptParseException.class) // public void shouldNotParseScriptWithUnknownKeyword() // throws Exception { // // String script = "written\n"; // // doParse(script); // } // // @Test(expected = ScriptParseException.class) // public void shouldNotParseScriptWithReadBeforeConnect() // throws Exception { // // String script = // "# tcp.client.connect-then-close\n" + // "read [0x01 0x02 0x03]\n" + // "connect tcp://localhost:7788\n" + // "connected\n" + // "close\n" + // "closed\n"; // // doParse(script); // } // // // @formatter:on // // /* // * TODO HACK. When parsing a script with accepted the parser will create a // * new stream. However, the AssociateStreamsVisitor transforms this and puts // * the acceptable nodes into the acceptable members. That is what this // * method does for us. If you have a better way to do this please let me // * know. I didn't want to use AssociateStreamsVisitor as that is part of the // * unit under test. // */ // private static AstScriptNode transformScript(AstScriptNode script) { // // /* Grab the streams for this script */ // ListIterator<AstStreamNode> iter = script.getStreams().listIterator(); // // /* // * This will be a reference to any acceptables the script has, assuming // * there exists a AcceptNode. Note this will be a reference to the // * acceptable list inside an AcceptNode // */ // List<AstAcceptableNode> scriptAcceptableList = null; // // /* // * Collect any Acceptable nodes and save them for adding to // * scriptAcceptableList // */ // List<AstAcceptableNode> collectAcceptableList = new LinkedList<AstAcceptableNode>(); // // while (iter.hasNext()) { // AstStreamNode node = iter.next(); // // if (node.getClass().equals(AstAcceptNode.class)) { // // /* If its the first one */ // if (scriptAcceptableList == null) { // scriptAcceptableList = ((AstAcceptNode) node) // .getAcceptables(); // } else { // /* // * Otherwise a subsequent add all the acceptables found to // * the last Node and grab a new list // */ // scriptAcceptableList.addAll(collectAcceptableList); // scriptAcceptableList = ((AstAcceptNode) node) // .getAcceptables(); // collectAcceptableList = new LinkedList<AstAcceptableNode>(); // } // } else if (node.getClass().equals(AstAcceptableNode.class)) { // /* Remove the Acceptable */ // iter.remove(); // collectAcceptableList.add((AstAcceptableNode) node); // } // } // /* Add all the acceptables to the last AcceptNode found */ // if (scriptAcceptableList != null) { // scriptAcceptableList.addAll(collectAcceptableList); // } // return script; // } }