/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include <iostream>
#include <string>

#include "cmGeneratedFileStream.h"
#include "cmSystemTools.h"

#define cmFailed(m1, m2)                                                      \
  std::cout << "FAILED: " << (m1) << (m2) << "\n";                            \
  failed = 1

int testGeneratedFileStream(int /*unused*/, char* /*unused*/[])
{
  int failed = 0;
  cmGeneratedFileStream gm;
  std::string file1 = "generatedFile1";
  std::string file2 = "generatedFile2";
  std::string file3 = "generatedFile3";
  std::string file4 = "generatedFile4";
  std::string file1tmp = file1 + ".tmp";
  std::string file2tmp = file2 + ".tmp";
  std::string file3tmp = file3 + ".tmp";
  std::string file4tmp = file4 + ".tmp";
  gm.Open(file1.c_str());
  gm << "This is generated file 1";
  gm.Close();
  gm.Open(file2.c_str());
  gm << "This is generated file 2";
  gm.Close();
  gm.Open(file3.c_str());
  gm << "This is generated file 3";
  gm.Close();
  gm.Open(file4.c_str());
  gm << "This is generated file 4";
  gm.Close();
  if (cmSystemTools::FileExists(file1.c_str())) {
    if (cmSystemTools::FileExists(file2.c_str())) {
      if (cmSystemTools::FileExists(file3.c_str())) {
        if (cmSystemTools::FileExists(file4.c_str())) {
          if (cmSystemTools::FileExists(file1tmp.c_str())) {
            cmFailed("Something wrong with cmGeneratedFileStream. Temporary "
                     "file is still here: ",
                     file1tmp.c_str());
          } else if (cmSystemTools::FileExists(file2tmp.c_str())) {
            cmFailed("Something wrong with cmGeneratedFileStream. Temporary "
                     "file is still here: ",
                     file2tmp.c_str());
          } else if (cmSystemTools::FileExists(file3tmp.c_str())) {
            cmFailed("Something wrong with cmGeneratedFileStream. Temporary "
                     "file is still here: ",
                     file3tmp.c_str());
          } else if (cmSystemTools::FileExists(file4tmp.c_str())) {
            cmFailed("Something wrong with cmGeneratedFileStream. Temporary "
                     "file is still here: ",
                     file4tmp.c_str());
          } else {
            std::cout << "cmGeneratedFileStream works\n";
          }
        } else {
          cmFailed(
            "Something wrong with cmGeneratedFileStream. Cannot find file: ",
            file4.c_str());
        }
      } else {
        cmFailed("Something wrong with cmGeneratedFileStream. Found file: ",
                 file3.c_str());
      }
    } else {
      cmFailed(
        "Something wrong with cmGeneratedFileStream. Cannot find file: ",
        file2.c_str());
    }
  } else {
    cmFailed("Something wrong with cmGeneratedFileStream. Cannot find file: ",
             file1.c_str());
  }
  cmSystemTools::RemoveFile(file1);
  cmSystemTools::RemoveFile(file2);
  cmSystemTools::RemoveFile(file3);
  cmSystemTools::RemoveFile(file4);
  cmSystemTools::RemoveFile(file1tmp);
  cmSystemTools::RemoveFile(file2tmp);
  cmSystemTools::RemoveFile(file3tmp);
  cmSystemTools::RemoveFile(file4tmp);

  return failed;
}
