// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_TESTING_STREAM_CAPTURE_H_
#define FLUTTER_TESTING_STREAM_CAPTURE_H_

#include <ostream>
#include <sstream>
#include <string>

namespace flutter {
namespace testing {

// Temporarily replaces the specified stream's output buffer to capture output.
//
// Example:
// StreamCapture captured_stdout(&std::cout);
// ... code that writest to std::cout ...
// std::string output = captured_stdout.GetCapturedOutput();
class StreamCapture {
 public:
  // Begins capturing output to the specified stream.
  explicit StreamCapture(std::ostream* ostream);

  // Stops capturing output to the specified stream, and restores the original
  // output buffer, if |Stop| has not already been called.
  ~StreamCapture();

  // Stops capturing output to the specified stream, and restores the original
  // output buffer.
  void Stop();

  // Returns any output written to the captured stream between construction and
  // the first call to |Stop|, if any, or now.
  std::string GetOutput() const;

 private:
  std::ostream* ostream_;
  std::stringstream buffer_;
  std::streambuf* old_buffer_;
};

}  // namespace testing
}  // namespace flutter

#endif  // FLUTTER_TESTING_STREAM_CAPTURE_H_
