Add support for clock ticks
This commit is contained in:
@@ -2,27 +2,34 @@
|
||||
#include "textgame.hpp"
|
||||
#include "driver.hpp"
|
||||
#include "drivenengine.hpp"
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
class TNTest : public DrivenEngine {
|
||||
void write_closed_message(Channel *ch, StreamBuffer *out) {
|
||||
std::ostringstream oss;
|
||||
oss << "Chan " << ch->chid() << " closed [" << ch->error() << "]\n";
|
||||
out->write_bytes(oss.str());
|
||||
}
|
||||
|
||||
void dump_lines(StreamBuffer *in, StreamBuffer *out, int chid) {
|
||||
while (true) {
|
||||
std::string l = in->readline();
|
||||
if (l == "") break;
|
||||
std::ostringstream oss;
|
||||
oss << "Chan " << chid << ": " << l;
|
||||
out->write_bytes(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
// This test allows input on stdin or on port 8085.
|
||||
// You can type lines and see them echoed.
|
||||
class TNTest1 : public DrivenEngine {
|
||||
public:
|
||||
std::vector<UniqueChannel> channels_;
|
||||
virtual void event_init() {
|
||||
// UniqueChannel ch = new_outgoing_channel("stanford.edu:80");
|
||||
// ch->out()->write_bytes("GET /index.html HTTP/1.1\n\n");
|
||||
// channels_.emplace_back(std::move(ch));
|
||||
listen_port(8085);
|
||||
}
|
||||
|
||||
void dump_lines(StreamBuffer *in, StreamBuffer *out, int chid) {
|
||||
while (true) {
|
||||
std::string l = in->readline();
|
||||
if (l == "") break;
|
||||
std::ostringstream oss;
|
||||
oss << "Chan " << chid << ": " << l;
|
||||
out->write_bytes(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
virtual void event_update() {
|
||||
while (true) {
|
||||
UniqueChannel ch = new_incoming_channel();
|
||||
@@ -37,9 +44,7 @@ public:
|
||||
for (UniqueChannel &ch : channels_) {
|
||||
dump_lines(ch->in(), stdioch->out(), ch->chid());
|
||||
if (ch->closed()) {
|
||||
std::ostringstream oss;
|
||||
oss << "Chan " << ch->chid() << " closed.\n";
|
||||
stdioch->out()->write_bytes(oss.str());
|
||||
write_closed_message(ch.get(), stdioch->out());
|
||||
} else {
|
||||
keep.emplace_back(std::move(ch));
|
||||
}
|
||||
@@ -48,9 +53,80 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// This test connects to a public webserver and prints
|
||||
// the output from the server.
|
||||
class TNTest2 : public DrivenEngine {
|
||||
public:
|
||||
std::vector<UniqueChannel> channels_;
|
||||
virtual void event_init() {
|
||||
UniqueChannel ch = new_outgoing_channel("stanford.edu:80");
|
||||
ch->out()->write_bytes("GET http://stanford.edu/index.html HTTP/1.1\n\n");
|
||||
channels_.emplace_back(std::move(ch));
|
||||
}
|
||||
|
||||
virtual void event_update() {
|
||||
Channel *stdioch = get_stdio_channel();
|
||||
dump_lines(stdioch->in(), stdioch->out(), 0);
|
||||
std::vector<UniqueChannel> keep;
|
||||
for (UniqueChannel &ch : channels_) {
|
||||
dump_lines(ch->in(), stdioch->out(), ch->chid());
|
||||
if (ch->closed()) {
|
||||
write_closed_message(ch.get(), stdioch->out());
|
||||
} else {
|
||||
keep.emplace_back(std::move(ch));
|
||||
}
|
||||
}
|
||||
channels_ = std::move(keep);
|
||||
}
|
||||
};
|
||||
|
||||
// This test produces a DNS resolution failure.
|
||||
class TNTest3 : public DrivenEngine {
|
||||
public:
|
||||
std::vector<UniqueChannel> channels_;
|
||||
virtual void event_init() {
|
||||
UniqueChannel ch = new_outgoing_channel("akjsdkajshdakjshd.alk:80");
|
||||
ch->out()->write_bytes("GET http://stanford.edu/index.html HTTP/1.1\n\n");
|
||||
channels_.emplace_back(std::move(ch));
|
||||
}
|
||||
|
||||
virtual void event_update() {
|
||||
Channel *stdioch = get_stdio_channel();
|
||||
dump_lines(stdioch->in(), stdioch->out(), 0);
|
||||
std::vector<UniqueChannel> keep;
|
||||
for (UniqueChannel &ch : channels_) {
|
||||
dump_lines(ch->in(), stdioch->out(), ch->chid());
|
||||
if (ch->closed()) {
|
||||
write_closed_message(ch.get(), stdioch->out());
|
||||
} else {
|
||||
keep.emplace_back(std::move(ch));
|
||||
}
|
||||
}
|
||||
channels_ = std::move(keep);
|
||||
}
|
||||
};
|
||||
|
||||
// This test just prints the time.
|
||||
class TNTest4 : public DrivenEngine {
|
||||
public:
|
||||
int count;
|
||||
virtual void event_init() {
|
||||
count = 0;
|
||||
}
|
||||
|
||||
virtual void event_update() {
|
||||
std::cerr << std::fixed << std::setprecision(2) << get_clock() << " ";
|
||||
count++;
|
||||
if (count == 10) {
|
||||
std::cerr << std::endl;
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
//TextGame tg;
|
||||
TNTest tg;
|
||||
TNTest4 tg;
|
||||
driver_drive(&tg);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user