我一直在玩curses sharp库(ac#wrapper for pdcurses),编写一些单元测试代码来处理api以及它是如何工作的,我想出了一个问题。 / p>
我可以使用以下代码在DLL中运行curses(以便nUnit可以测试它):
bool consoleAllocated = AllocConsole();
if (!consoleAllocated)
throw new Exception("Unable to allocate a new console.");
Curses.InitScr();
Stdscr.Add(4, 6, "This is a test title");
Curses.EndWin();
FreeConsole();
AllocConsole和FreeConsole是从kernel32导入的extern。
我想要做的是能够将位置4,6的控制台输出读取到字符串,以便以编程方式检查我输入的字符串是否已正确输出。能够像这样进行检查以便使用TDD创建一个curses风格的应用程序非常重要。
我查看了Curses和Stdscr对象(包括Curses Sharp对象)和Console对象(来自windows库)并且还没有找到方法。有没有人有任何想法?
答案 0 :(得分:3)
我设法找到答案,如果有人有兴趣,我已经包含了下面的代码。它很乱,因为我还没有把它清理干净,但它应该作为如何做到这一点的一个例子。
感谢pinvoke.net出色的签名收藏。
[DllImport("kernel32", SetLastError = true)]
static extern bool AllocConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool FreeConsole();
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32", SetLastError = true)]
static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput,
[Out]StringBuilder lpCharacter, uint nLength, COORD dwReadCoord,
out uint lpNumberOfCharsRead);
const int STD_OUTPUT_HANDLE = -11;
[StructLayout(LayoutKind.Sequential)]
struct COORD
{
public short X;
public short Y;
}
[Test]
public void WriteTitle()
{
bool consoleAllocated = AllocConsole();
if (!consoleAllocated)
throw new Exception("Unable to allocate a new console.");
Curses.InitScr();
Stdscr.Add(4, 6, "This is a test title");
Stdscr.Refresh();
IntPtr stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
uint length = 20;
StringBuilder consoleOutput = new StringBuilder((int)length);
COORD readCoord;
readCoord.X = 6;
readCoord.Y = 4;
uint numOfCharsRead = 0;
ReadConsoleOutputCharacter(stdOut, consoleOutput, length, readCoord, out numOfCharsRead);
string outputString = consoleOutput.ToString();
Assert.That(outputString, Is.EqualTo("This is a test title"));
Curses.EndWin();
FreeConsole();
}