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

            session.VerifyStart();

            session.VerifyCommand(() => session.StringAt(1, 0, "Fred"), "MoveCursor(1,0) String(Fred)");

            session.VerifyCommand(
                () => session.StringAt(new[]
            {
                new StringAtBlock {
                    Row = 1, Column = 0, Text = "Fred"
                },
                new StringAtBlock {
                    Row = 2, Column = 4, Text = "Smith"
                }
            }),
                "MoveCursor(1,0) String(Fred) MoveCursor(2,4) String(Smith)");

            session.VerifyCommand(
                () => session.StringAt(1, 0, "Fred", eraseEof: true),
                "MoveCursor(1,0) EraseEOF() String(Fred)");

            // Exercise row and column checking.
            Assert.Throws <ArgumentOutOfRangeException>(() => session.StringAt(-1, 0, "foo"));
            Assert.Throws <ArgumentOutOfRangeException>(() => session.StringAt(0, -1, "foo"));

            // Force exceptions.
            session.ExceptionMode = true;
            session.AllFail       = true;
            Assert.Throws <X3270ifCommandException>(() => session.StringAt(1, 0, "foo"));
            Assert.Throws <X3270ifCommandException>(() =>
            {
                var result = session.StringAt(new[]
                {
                    new StringAtBlock {
                        Row = 1, Column = 0, Text = "Fred"
                    },
                    new StringAtBlock {
                        Row = 2, Column = 4, Text = "Smith"
                    }
                });
            });

            session.Close();
        }