在测试程序时,能够将字符串泵入stdin进行处理(VSCode 1.15.0-insider / Linux Mint 18.2上的libvala-0.36)会很不错。下面只是为了说明,但stdin.puts / stdin.flush似乎不起作用。如何将键击/字符串泵入stdin?
private void test_func(){
...do stuff
stdin.puts("""{"event":"server.connected","params":{"version":"0.0.1","pid":0}}""");
...do stuff
stdin.puts("exit\r\n");
}
public static int main (string[] args) {
string line;
...do stuff
#if DEBUG
test_func();
#endif
while ((line = stdin.read_line ()) != null) {
line = line.strip ();
if (line.length > 0) {
if (line == "exit") break;
gJsonRPC.handle_request (line);
}
}
...do stuff
}
更新: 没有找到类似于GLIB中的.Net“SendKeys”类的功能,所以暂时解决了这个方法....
public static void SendKeys(string sKeys) {
//--------------------------------------------------------------
//OSS:Hack:SendKeys
//--------------------------------------------------------------
char[] _keys = sKeys.to_utf8();
for (int i = _keys.length; i >= 0; i--)
stdin.ungetc (_keys[i]);
//--------------------------------------------------------------
}
@Lasall建议FileStream.open(¨/ dev /stdin¨,¨w¨),所以我接下来试试。
答案 0 :(得分:2)
GLib.stdin
实际上只是一个GLib.FileStream
。
您可以将处理代码封装在一个采用FileStream的函数中:
public void my_processing_func (FileStream stream) {
while ((line = stream.read_line ()) != null) {
line = line.strip ();
if (line.length > 0) {
if (line == "exit") break;
gJsonRPC.handle_request (line);
}
}
}
}
然后在您的主要内容中,您可以有条件地使用您的测试数据或stdin:
#ifdef DEBUG
var stream = test_func ();
#else
var stream = stdin;
#endif
my_processing_func (stream);
我可能不会使用DEBUG,但有一些更具描述性的名称,如TEST_DATA,使用正确的单元测试并编写测试程序而不是#ifdefing主程序可能更好。