#include "../filesystem/filesystem.hpp"
#include <gtest/gtest.h>

TEST(FileTest, FilesWork)
{
	sprawl::filesystem::File f = sprawl::filesystem::Open("./test.txt", "w");
	f.Write("Hi there!");
	f.Flush();
	f.Sync();
	EXPECT_EQ(9, f.Tell());
	EXPECT_EQ(9, f.FileSize());
	EXPECT_FALSE(f.IsClosed());

	f.Seek(5, sprawl::filesystem::RelativeTo::Beginning);
	EXPECT_EQ(5, f.Tell());
	EXPECT_EQ(9, f.FileSize());
	f.Seek(2, sprawl::filesystem::RelativeTo::CurrentPosition);
	EXPECT_EQ(7, f.Tell());
	EXPECT_EQ(9, f.FileSize());
	f.Seek(-3, sprawl::filesystem::RelativeTo::End);
	EXPECT_EQ(6, f.Tell());
	EXPECT_EQ(9, f.FileSize());

	EXPECT_EQ(sprawl::String("w"), f.Mode());

	f.Close();

	EXPECT_TRUE(f.IsClosed());

	f = sprawl::filesystem::Open("./test.txt", "r+");

	EXPECT_FALSE(f.IsClosed());
	EXPECT_FALSE(f.IsATTY());
	EXPECT_EQ(9, f.FileSize());

	EXPECT_EQ(sprawl::String("r+"), f.Mode());

	sprawl::String str = f.Read(2);
	EXPECT_EQ(sprawl::String("Hi"), str);

	f.Seek(0, sprawl::filesystem::RelativeTo::Beginning);

	str = f.Read();
	EXPECT_EQ(sprawl::String("Hi there!"), str);

	f.Truncate(2);
	EXPECT_EQ(2, f.Tell());
	EXPECT_EQ(2, f.FileSize());
	f.Seek(0, sprawl::filesystem::RelativeTo::Beginning);

	str = f.Read();
	EXPECT_EQ(sprawl::String("Hi"), str);

	f.Close();

	f = sprawl::filesystem::Open("./test.txt", "r+");
	EXPECT_EQ(2, f.FileSize());

	str = f.Read();
	EXPECT_EQ(sprawl::String("Hi"), str);

	f.Close();

	f = sprawl::filesystem::Open("./test.txt", "w");
	f.Write("Hello");
	f.Write(sprawl::filesystem::LineSeparator());
	f.Write("World");
	f.Close();

	f = sprawl::filesystem::Open("./test.txt", "r");
	sprawl::String hello = f.ReadLine();
	sprawl::String world = f.ReadLine();
	EXPECT_EQ(sprawl::String("Hello{}").format(sprawl::filesystem::LineSeparator()), hello);
	EXPECT_EQ(sprawl::String("World"), world);
}
