public void TestCodePage()
        {
            var session = new MockTaskSession();

            session.CodePage = "CP1252";
            Assert.IsTrue(session.Start().Success);

            session.Close();
            session.CodePage = "Junk";
            Assert.IsFalse(session.Start().Success);

            session.CodePage     = null;
            session.CodePageFail = true;
            Assert.IsFalse(session.Start().Success);
        }
        public void TestFullHistory()
        {
            // Start a mock thread session.
            var session     = new MockTaskSession();
            var startResult = session.Start();

            Assert.AreEqual(true, startResult.Success);

            // Make sure the start shows the initial empty command.
            var history = session.RecentCommands;

            Assert.AreEqual(1, history.Length);
            Assert.AreEqual("Query(LocalEncoding)", history[0].Command);

            // Overflow the history list.
            for (int i = 0; i < Session.MaxCommands; i++)
            {
                Assert.AreEqual(true, session.Io("Lines 1").Success);
            }

            history = session.RecentCommands;
            Assert.AreEqual("Lines 1", history[0].Command);
            Assert.AreEqual("Line 1", history[0].Result[0]);

            session.Close();
        }
        public void TestQuery()
        {
            var session = new MockTaskSession();

            session.VerifyStart();

            session.VerifyCommand(() => session.Query(QueryType.BindPluName), "Query(BindPluName)");

            Assert.AreEqual(session.Query(QueryType.Cursor).Result[0], "0 0");

            // Force an exception.
            session.ExceptionMode = true;
            session.AllFail       = true;
            Assert.Throws <X3270ifCommandException>(() => session.Query(QueryType.Formatted));

            session.Close();

            // Exercise 1-origin.
            session = new MockTaskSession(new MockTaskConfig {
                Origin = 1
            });
            session.Start();
            Assert.AreEqual(session.Query(QueryType.Cursor).Result[0], "1 1");

            // Make sure the history contains the actual value from the emulator.
            Assert.AreEqual(session.RecentCommands[0].Result[0], "0 0");

            session.Close();
        }
        public void TestIoArgs()
        {
            var session = new MockTaskSession();

            session.Start();

            Assert.Throws <ArgumentException>(() => session.Io("Foo(\0)"));
        }
        public void TestTaskMockSession()
        {
            var session     = new MockTaskSession();
            var startResult = session.Start();

            Assert.AreEqual(true, startResult.Success);

            // Test canned responses.
            var result = session.Io("Lines 1");

            Assert.AreEqual(true, result.Success);
            Assert.AreEqual(1, result.Result.Length);
            Assert.AreEqual("Line 1", result.Result[0]);

            result = session.Io("Lines 2");
            Assert.AreEqual(true, result.Success);
            Assert.AreEqual(2, result.Result.Length);
            Assert.AreEqual("Line 1", result.Result[0]);
            Assert.AreEqual("Line 2", result.Result[1]);

            result = session.Io("Fail");
            Assert.AreEqual(false, result.Success);
            Assert.AreEqual(1, result.Result.Length);
            Assert.AreEqual("failed", result.Result[0]);

            // Test a double start.
            Assert.Throws <InvalidOperationException>(() => session.Start());

            // Test the I/O timeout.
            Assert.AreEqual(true, startResult.Success);
            result = session.Io("Hang 100", 50);
            Assert.AreEqual(false, result.Success);
            session.Close();

            // Test the EOF response.
            startResult = session.Start();
            Assert.AreEqual(true, startResult.Success);
            result = session.Io("Quit");
            Assert.AreEqual(false, result.Success);
            Assert.AreEqual(false, session.EmulatorRunning);
            Assert.AreEqual(false, session.LastCommand.Success);
            session.Close();

            // Test the exception for I/O on a closed session.
            Assert.Throws <InvalidOperationException>(() => session.Io("Xxx"));
        }
        public void TestStatusField()
        {
            var session = new MockTaskSession();

            // Test StatusField exception when not running.
            Assert.Throws <InvalidOperationException>(() => session.StatusField(StatusLineField.Formatting));

            var startResult = session.Start();

            Assert.AreEqual(true, startResult.Success);

            // Test ordinary StatusField.
            Assert.AreEqual("F", session.StatusField(StatusLineField.Formatting));

            // Test origin-based StatusField.
            Assert.AreEqual("0", session.StatusField(StatusLineField.CursorRow));
            Assert.AreEqual("0", session.StatusField(StatusLineField.CursorColumn));

            session.Close();

            // Test origin-based StatusField with 1-origin.
            session = new MockTaskSession(new MockTaskConfig {
                Origin = 1
            });
            session.Start();
            Assert.AreEqual("1", session.StatusField(StatusLineField.CursorRow));
            Assert.AreEqual("1", session.StatusField(StatusLineField.CursorColumn));

            // Exercise HostConnected (based on the status line).
            Assert.AreEqual(true, session.HostConnected);

            // Change that.
            session.Connected = false;

            // (Have to run a dummy command to get a new prompt and change state.)
            session.Io("Query()");
            Assert.AreEqual(false, session.HostConnected);

            // Now screen-modifying commands will fail.
            Assert.AreEqual(false, session.Enter().Success);

            // Now exception mode will fire, too.
            session.ExceptionMode = true;
            Assert.Throws <X3270ifCommandException>(() => session.Enter());

            // Try requiring 3270 mode instead.
            session.Config.ModifyFail = ModifyFailType.Require3270;
            Assert.Throws <X3270ifCommandException>(() => session.Enter());

            // And that normally, it's fine.
            session.Connected = true;
            session.Connect("bob");
            Assert.DoesNotThrow(() => session.Enter());

            session.Close();
        }
        public void TestBrokenSession()
        {
            var session = new MockTaskSession();

            session.Start();

            var result = session.Io("Quit");

            Assert.AreEqual(false, result.Success);
            Assert.AreEqual(false, session.EmulatorRunning);

            session.Close();
            session.Start();
            result = session.Io("ReplyQuit");
            Assert.AreEqual(true, result.Success);
            Thread.Sleep(500);
            result = session.Io("Anything");
            Assert.AreEqual(false, result.Success);
            Assert.AreEqual(false, session.EmulatorRunning);
        }
        public void TestExceptionMode()
        {
            var session     = new MockTaskSession();
            var startResult = session.Start();

            Assert.AreEqual(true, startResult.Success);

            session.ExceptionMode = true;
            Assert.Throws <X3270ifCommandException>(() => session.Io("Fail"));
            Assert.Throws <X3270ifCommandException>(() => session.Io("Fail()"));
            Assert.Throws <X3270ifCommandException>(() => session.Io("Quit"));
            session.Close();
        }
        public void TestTaskMockSessionHungStart()
        {
            var startup = new MockTaskConfig
            {
                HandshakeTimeoutMsec = 50
            };
            var session = new MockTaskSession(startup);

            session.HangMsec = 100;

            // Test a hung start.
            var startResult = session.Start();

            Assert.AreEqual(false, startResult.Success);
        }
        public void TestStartExceptionMode()
        {
            // Set the handshake timeout to 50msec.
            var startup = new MockTaskConfig
            {
                HandshakeTimeoutMsec = 50
            };
            var session = new MockTaskSession(startup);

            // Set the response hang time to twice that.
            session.HangMsec = 100;

            // Set exception mode for any failure, including Start.
            session.ExceptionMode = true;

            // Boom.
            Assert.Throws <X3270ifCommandException>(() => session.Start());
        }
        /// <summary>
        /// Start a mock session and make sure it was successful.
        /// </summary>
        /// <param name="session">Session to start.</param>
        public static void VerifyStart(this MockTaskSession session)
        {
            var result = session.Start();

            Assert.AreEqual(true, result.Success);
        }