Commit 67a49279 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

stringoutputstream

parent 21cbf1ba
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -7,8 +7,6 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fnordmetric/util/unittest.h>
#include <fnordmetric/util/outputstream.h>
#include <fnordmetric/query/backends/csv/csvtableref.h>
#include <fnordmetric/query/executable.h>
#include <fnordmetric/query/parser.h>
@@ -20,6 +18,12 @@
#include <fnordmetric/query/tablerepository.h>
#include <fnordmetric/query/token.h>
#include <fnordmetric/query/tokenize.h>
#include <fnordmetric/ui/canvas.h>
#include <fnordmetric/ui/svgtarget.h>
#include <fnordmetric/util/inputstream.h>
#include <fnordmetric/util/outputstream.h>
#include <fnordmetric/util/unittest.h>
#include <fnordmetric/util/runtimeexception.h>

using namespace fnordmetric::query;

@@ -31,6 +35,24 @@ static Parser parseTestQuery(const char* query) {
  return parser;
}

static void compareChart(
    fnordmetric::ui::Canvas* chart,
    const std::string& file_path) {
  std::string output_str;
  fnordmetric::util::StringOutputStream output_stream(&output_str);
  fnordmetric::ui::SVGTarget target(&output_stream);
  chart->render(&target);

  std::string input_str;
  auto input_stream = fnordmetric::util::FileInputStream::openFile(file_path);
  input_stream->readUntilEOF(&input_str);

  if (input_str != output_str) {
    RAISE(fnordmetric::util::RuntimeException,
        "chart does not match '%s'", file_path.c_str());
  }
}

class TestTableRef : public TableRef {
  int getColumnIndex(const std::string& name) override {
    if (name == "one") return 0;
@@ -956,7 +978,10 @@ TEST_CASE(QueryTest, SimpleEndToEndTest, [] () {

  query.execute();
  auto chart = query.getChart(0);
  chart->renderSVG();

  compareChart(
      chart,
      "build/tests/tmp/QueryTest_SimpleEndToEndTest_out.svg.html");
});


+20 −1
Original line number Diff line number Diff line
@@ -59,7 +59,15 @@ FileOutputStream::~FileOutputStream() {
}

size_t FileOutputStream::write(char* data, size_t size) {
  return 0;
  int bytes_written = -1;

  bytes_written = ::write(fd_, data, size);

  if (bytes_written < 0) {
    RAISE_ERRNO(RuntimeException, "write() failed");
  }

  return bytes_written;
}

size_t FileOutputStream::printf(const char* format, ...) {
@@ -75,6 +83,17 @@ size_t FileOutputStream::printf(const char* format, ...) {
  return pos;
}

std::unique_ptr<StringOutputStream> StringOutputStream::fromString(
    std::string* string) {
  return std::unique_ptr<StringOutputStream>(new StringOutputStream(string));
}

StringOutputStream::StringOutputStream(std::string* string) : str_(string) {}

size_t StringOutputStream::write(char* data, size_t size) {
  *str_ += std::string(data, size);
  return size;
}

}
}
+30 −0
Original line number Diff line number Diff line
@@ -89,6 +89,36 @@ protected:
  bool close_on_destroy_;
};

class StringOutputStream : public OutputStream {
public:

  /**
   * Create a new OutputStream from the provided string
   *
   * @param string the input string
   */
  static std::unique_ptr<StringOutputStream> fromString(std::string* string);

  /**
   * Create a new OutputStream from the provided string
   *
   * @param string the input string
   */
  StringOutputStream(std::string* string);

  /**
   * Write the next n bytes to the file. This may raise an exception.
   * Returns the number of bytes that have been written.
   *
   * @param data a pointer to the data to be written
   * @param size then number of bytes to be written
   */
  size_t write(char* data, size_t size) override;

protected:
  std::string* str_;
};

}
}
#endif