Переглянути джерело

Added FileOutputStream class

- added FileOutputStream class to keep file
descriptor open for a specific file to frequently
write data to it
- added test for FileOutputStream class
Patrick-Laptop 4 роки тому
батько
коміт
6f8ac26869

+ 5 - 2
CMakeLists.txt

@@ -70,7 +70,9 @@ set(SOURCE_FILES
         ${CMAKE_CURRENT_SOURCE_DIR}/source/io/IStorable.hpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/io/StorableFile.hpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/io/StorableFile.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/io/LogLevel.hpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/io/LogLevel.hpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/io/FileOutputStream.hpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/io/FileOutputStream.cpp)
 
 set(TEST_FILES
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/IntegerTest.cpp
@@ -87,7 +89,8 @@ set(TEST_FILES
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/FileWriterTest.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/FileReaderTest.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/utils/RegexUtilsTest.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/StorableFileTest.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/StorableFileTest.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/FileOutputStreamTest.cpp)
 
 ##########################################################
 # Build

+ 54 - 0
source/io/FileOutputStream.cpp

@@ -0,0 +1,54 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-20
+ * Changed:         2020-08-20
+ *
+ * */
+
+#include "FileOutputStream.hpp"
+#include "../exception/FileNotFoundException.hpp"
+#include "../exception/FileOperationException.hpp"
+
+ls_std::FileOutputStream::FileOutputStream(File &_file) : Class("FileOutputStream"),
+file(_file)
+{
+  if(!_file.exists()) {
+    throw ls_std::FileNotFoundException {};
+  } else {
+    this->outputStream.open(_file.getAbsoluteFilePath());
+  }
+}
+
+ls_std::FileOutputStream::~FileOutputStream()
+{
+  this->_close();
+}
+
+void ls_std::FileOutputStream::close()
+{
+  this->_close();
+}
+
+bool ls_std::FileOutputStream::write(const ls_std::byte *_data)
+{
+  bool succeeded {};
+
+  if(this->outputStream.is_open()) {
+    if (this->outputStream << _data) {
+      succeeded = true;
+    }
+  } else {
+    throw ls_std::FileOperationException {};
+  }
+
+  return succeeded;
+}
+
+void ls_std::FileOutputStream::_close()
+{
+  if(this->outputStream.is_open()) {
+    this->outputStream.close();
+  }
+}

+ 37 - 0
source/io/FileOutputStream.hpp

@@ -0,0 +1,37 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-20
+ * Changed:         2020-08-20
+ *
+ * */
+
+#ifndef FILE_OUTPUT_STREAM_HPP
+#define FILE_OUTPUT_STREAM_HPP
+
+#include "../base/Class.hpp"
+#include "File.hpp"
+#include "IWriter.hpp"
+#include <fstream>
+
+namespace ls_std {
+  class FileOutputStream : public Class, IWriter {
+    public:
+
+      explicit FileOutputStream(File& _file);
+      ~FileOutputStream();
+
+      void close();
+      bool write(const ls_std::byte* _data) override;
+
+    private:
+
+      File file;
+      std::ofstream outputStream {};
+
+      void _close();
+  };
+}
+
+#endif

+ 41 - 0
test/cases/io/FileOutputStreamTest.cpp

@@ -0,0 +1,41 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-20
+ * Changed:         2020-08-20
+ *
+ * */
+
+#include <gtest/gtest.h>
+#include "../../../source/io/File.hpp"
+#include "../../TestHelper.hpp"
+#include "../../../source/io/FileOutputStream.hpp"
+
+namespace {
+  class FileOutputStreamTest : public ::testing::Test {
+    protected:
+
+      FileOutputStreamTest() = default;
+      ~FileOutputStreamTest() override = default;
+
+      void SetUp() override {}
+      void TearDown() override {}
+  };
+
+  TEST_F(FileOutputStreamTest, write)
+  {
+    std::string path = TestHelper::getResourcesFolderLocation() + "tmp_output_stream.txt";
+    ls_std::File file {path};
+    file.createNewFile();
+    ASSERT_TRUE(file.exists());
+
+    ls_std::FileOutputStream outputStream {file};
+    ASSERT_TRUE(outputStream.write("Hello! "));
+    ASSERT_TRUE(outputStream.write("How are you?"));
+    outputStream.close();
+
+    file.remove();
+    ASSERT_FALSE(file.exists());
+  }
+}