#include "nsFileSpec.h"
#include "nsFileStream.h"

NS_NAMESPACE FileTest
{
	NS_NAMESPACE_PROTOTYPE void WriteStuff(nsOutputFileStream& s);
} NS_NAMESPACE_END

//----------------------------------------------------------------------------------------
void FileTest::WriteStuff(nsOutputFileStream& s)
//----------------------------------------------------------------------------------------
{
	// Initialize a URL from a string without suffix.  Change the path to suit your machine.
	nsFileURL fileURL("file:///Development/MPW/MPW%20Shell");
	s << "File URL initialized to:     \"" << fileURL << "\""<< nsEndl;
	
	// Initialize a Unix path from a URL
	nsFilePath filePath(fileURL);
	s << "As a unix path:              \"" << (const char*)filePath << "\""<< nsEndl;
	
	// Initialize a native file spec from a URL
	nsNativeFileSpec fileSpec(fileURL);
	s << "As a file spec:               " << fileSpec << nsEndl;
	
	// Make the spec unique (this one has no suffix).
	fileSpec.MakeUnique();
	s << "Unique file spec:             " << fileSpec << nsEndl;
	
	// Assign the spec to a URL
	fileURL = fileSpec;
	s << "File URL assigned from spec: \"" << fileURL << "\""<< nsEndl;
	
	// Assign a unix path using a string with a suffix.
	filePath = "/Development/MPW/SysErrs.err";
	s << "File path reassigned to:     \"" << (const char*)filePath << "\""<< nsEndl;	
	
	// Assign to a file spec using a unix path.
	fileSpec = filePath;
	s << "File spec reassigned to:      " << fileSpec << nsEndl;
	
	// Make this unique (this one has a suffix).
	fileSpec.MakeUnique();
	s << "File spec made unique:        " << fileSpec << nsEndl;
} // WriteStuff

//----------------------------------------------------------------------------------------
void main()
// For use with DEBUG defined.
//----------------------------------------------------------------------------------------
{

	// Test of nsFileSpec
	
	nsOutputFileStream nsOut(cout);
	nsOut << "WRITING TEST OUTPUT TO cout" << nsEndl << nsEndl;

	FileTest::WriteStuff(nsOut);
	nsOut << nsEndl << nsEndl;
	
	// Test of nsOutputFileStream

	nsFilePath myTextFilePath("/Development/iotest.txt");

	{
		nsOut << "WRITING IDENTICAL OUTPUT TO " << (const char*)myTextFilePath << nsEndl << nsEndl;
		nsOutputFileStream testStream(myTextFilePath);
		NS_ASSERTION(testStream.is_open(), "File could not be opened");
		FileTest::WriteStuff(testStream);
	}	// <-- Scope closes the stream (and the file).

	// Test of nsInputFileStream

	{
		nsOut << "READING BACK DATA FROM " << (const char*)myTextFilePath << nsEndl << nsEndl;
		nsInputFileStream testStream2(myTextFilePath);
		NS_ASSERTION(testStream2.is_open(), "File could not be opened");
		char line[1000];
		
		testStream2.seek(0); // check that the seek compiles
		while (!testStream2.eof())
		{
			testStream2.readline(line, sizeof(line));
			nsOut << line << nsEndl;
		}
	}
} // main
