CS144Lab/tests/byte_stream_test_harness.hh
2021-09-21 17:11:37 -07:00

143 lines
3.9 KiB
C++

#ifndef SPONGE_BYTE_STREAM_HARNESS_HH
#define SPONGE_BYTE_STREAM_HARNESS_HH
#include "byte_stream.hh"
#include "util.hh"
#include <exception>
#include <initializer_list>
#include <iostream>
#include <memory>
#include <optional>
#include <string>
struct ByteStreamTestStep {
virtual operator std::string() const;
virtual void execute(ByteStream &) const;
virtual ~ByteStreamTestStep();
};
class ByteStreamExpectationViolation : public std::runtime_error {
public:
ByteStreamExpectationViolation(const std::string &msg);
template <typename T>
static ByteStreamExpectationViolation property(const std::string &property_name,
const T &expected,
const T &actual);
};
struct ByteStreamExpectation : public ByteStreamTestStep {
operator std::string() const override;
virtual std::string description() const;
virtual void execute(ByteStream &) const override;
virtual ~ByteStreamExpectation() override;
};
struct ByteStreamAction : public ByteStreamTestStep {
operator std::string() const override;
virtual std::string description() const;
virtual void execute(ByteStream &) const override;
virtual ~ByteStreamAction() override;
};
struct EndInput : public ByteStreamAction {
std::string description() const override;
void execute(ByteStream &) const override;
};
struct Write : public ByteStreamAction {
std::string _data;
std::optional<size_t> _bytes_written{};
Write(const std::string &data);
Write &with_bytes_written(const size_t bytes_written);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct Pop : public ByteStreamAction {
size_t _len;
Pop(const size_t len);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct InputEnded : public ByteStreamExpectation {
bool _input_ended;
InputEnded(const bool input_ended);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct BufferEmpty : public ByteStreamExpectation {
bool _buffer_empty;
BufferEmpty(const bool buffer_empty);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct Eof : public ByteStreamExpectation {
bool _eof;
Eof(const bool eof);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct BufferSize : public ByteStreamExpectation {
size_t _buffer_size;
BufferSize(const size_t buffer_size);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct BytesWritten : public ByteStreamExpectation {
size_t _bytes_written;
BytesWritten(const size_t bytes_written);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct BytesRead : public ByteStreamExpectation {
size_t _bytes_read;
BytesRead(const size_t bytes_read);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct RemainingCapacity : public ByteStreamExpectation {
size_t _remaining_capacity;
RemainingCapacity(const size_t remaining_capacity);
std::string description() const override;
void execute(ByteStream &) const override;
};
struct Peek : public ByteStreamExpectation {
std::string _output;
Peek(const std::string &output);
std::string description() const override;
void execute(ByteStream &) const override;
};
class ByteStreamTestHarness {
std::string _test_name;
ByteStream _byte_stream;
std::vector<std::string> _steps_executed{};
public:
ByteStreamTestHarness(const std::string &test_name, const size_t capacity);
void execute(const ByteStreamTestStep &step);
};
#endif // SPONGE_BYTE_STREAM_HARNESS_HH