Merge pull request #23 from src-d/test-improvements

test improvements
diff --git a/test/fs_suite.go b/test/fs_suite.go
index 6ab003b..d6006d3 100644
--- a/test/fs_suite.go
+++ b/test/fs_suite.go
@@ -25,6 +25,32 @@
 	c.Assert(f.Filename(), Equals, "foo")
 }
 
+func (s *FilesystemSuite) TestOpen(c *C) {
+	f, err := s.FS.Create("foo")
+	c.Assert(err, IsNil)
+	c.Assert(f.Filename(), Equals, "foo")
+	c.Assert(f.Close(), IsNil)
+
+	f, err = s.FS.Open("foo")
+	c.Assert(err, IsNil)
+	c.Assert(f.Filename(), Equals, "foo")
+}
+
+func (s *FilesystemSuite) TestOpenNotExists(c *C) {
+	f, err := s.FS.Open("not-exists")
+	c.Assert(err, NotNil)
+	c.Assert(f, IsNil)
+}
+
+func (s *FilesystemSuite) TestCreateDir(c *C) {
+	err := s.FS.MkdirAll("foo", 0644)
+	c.Assert(err, IsNil)
+
+	f, err := s.FS.Create("foo")
+	c.Assert(err, NotNil)
+	c.Assert(f, IsNil)
+}
+
 func (s *FilesystemSuite) TestCreateDepth(c *C) {
 	f, err := s.FS.Create("bar/foo")
 	c.Assert(err, IsNil)
@@ -76,6 +102,36 @@
 	c.Assert(f.Close(), IsNil)
 }
 
+func (s *FilesystemSuite) TestOpenFile(c *C) {
+	defaultMode := os.FileMode(0666)
+
+	f, err := s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
+	c.Assert(err, IsNil)
+	s.testWriteClose(c, f, "foo1")
+
+	// Truncate if it exists
+	f, err = s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
+	c.Assert(err, IsNil)
+	c.Assert(f.Filename(), Equals, "foo1")
+	s.testWriteClose(c, f, "foo1overwritten")
+
+	// Read-only if it exists
+	f, err = s.FS.OpenFile("foo1", os.O_RDONLY, defaultMode)
+	c.Assert(err, IsNil)
+	c.Assert(f.Filename(), Equals, "foo1")
+	s.testReadClose(c, f, "foo1overwritten")
+
+	// Create when it does exist
+	f, err = s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
+	c.Assert(err, IsNil)
+	c.Assert(f.Filename(), Equals, "foo1")
+	s.testWriteClose(c, f, "bar")
+
+	f, err = s.FS.OpenFile("foo1", os.O_RDONLY, defaultMode)
+	c.Assert(err, IsNil)
+	s.testReadClose(c, f, "bar")
+}
+
 func (s *FilesystemSuite) TestOpenFileNoTruncate(c *C) {
 	defaultMode := os.FileMode(0666)
 
@@ -142,36 +198,6 @@
 	s.testReadClose(c, f, "quxbar")
 }
 
-func (s *FilesystemSuite) TestOpenFile(c *C) {
-	defaultMode := os.FileMode(0666)
-
-	f, err := s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
-	c.Assert(err, IsNil)
-	s.testWriteClose(c, f, "foo1")
-
-	// Truncate if it exists
-	f, err = s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
-	c.Assert(err, IsNil)
-	c.Assert(f.Filename(), Equals, "foo1")
-	s.testWriteClose(c, f, "foo1overwritten")
-
-	// Read-only if it exists
-	f, err = s.FS.OpenFile("foo1", os.O_RDONLY, defaultMode)
-	c.Assert(err, IsNil)
-	c.Assert(f.Filename(), Equals, "foo1")
-	s.testReadClose(c, f, "foo1overwritten")
-
-	// Create when it does exist
-	f, err = s.FS.OpenFile("foo1", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, defaultMode)
-	c.Assert(err, IsNil)
-	c.Assert(f.Filename(), Equals, "foo1")
-	s.testWriteClose(c, f, "bar")
-
-	f, err = s.FS.OpenFile("foo1", os.O_RDONLY, defaultMode)
-	c.Assert(err, IsNil)
-	s.testReadClose(c, f, "bar")
-}
-
 func (s *FilesystemSuite) TestOpenFileWithModes(c *C) {
 	f, err := s.FS.OpenFile("foo", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
 	c.Assert(err, IsNil)
@@ -196,41 +222,114 @@
 	c.Assert(f.Close(), IsNil)
 }
 
-func (s *FilesystemSuite) TestFileCreateReadSeek(c *C) {
+func (s *FilesystemSuite) TestFileWrite(c *C) {
 	f, err := s.FS.Create("foo")
 	c.Assert(err, IsNil)
 
-	n, err := f.Write([]byte("0123456789abcdefghijklmnopqrstuvwxyz"))
+	n, err := f.Write([]byte("foo"))
 	c.Assert(err, IsNil)
-	c.Assert(n, Equals, 36)
+	c.Assert(n, Equals, 3)
 
-	p, err := f.Seek(10, io.SeekStart)
-	c.Assert(err, IsNil)
-	c.Assert(int(p), Equals, 10)
-
+	f.Seek(0, io.SeekStart)
 	all, err := ioutil.ReadAll(f)
 	c.Assert(err, IsNil)
-	c.Assert(string(all), Equals, "abcdefghijklmnopqrstuvwxyz")
+	c.Assert(string(all), Equals, "foo")
 	c.Assert(f.Close(), IsNil)
 }
 
-func (s *FilesystemSuite) TestFileOpenReadSeek(c *C) {
+func (s *FilesystemSuite) TestFileWriteClose(c *C) {
+	f, err := s.FS.Create("foo")
+	c.Assert(err, IsNil)
+
+	c.Assert(f.Close(), IsNil)
+
+	_, err = f.Write([]byte("foo"))
+	c.Assert(err, NotNil)
+}
+
+func (s *FilesystemSuite) TestFileRead(c *C) {
+	err := WriteFile(s.FS, "foo", []byte("foo"), 0644)
+	c.Assert(err, IsNil)
+
+	f, err := s.FS.Open("foo")
+	c.Assert(err, IsNil)
+
+	all, err := ioutil.ReadAll(f)
+	c.Assert(err, IsNil)
+	c.Assert(string(all), Equals, "foo")
+	c.Assert(f.Close(), IsNil)
+}
+
+func (s *FilesystemSuite) TestFileClosed(c *C) {
+	err := WriteFile(s.FS, "foo", []byte("foo"), 0644)
+	c.Assert(err, IsNil)
+
+	f, err := s.FS.Open("foo")
+	c.Assert(err, IsNil)
+	c.Assert(f.Close(), IsNil)
+
+	_, err = ioutil.ReadAll(f)
+	c.Assert(err, NotNil)
+}
+
+func (s *FilesystemSuite) TestFileNonRead(c *C) {
+	err := WriteFile(s.FS, "foo", []byte("foo"), 0644)
+	c.Assert(err, IsNil)
+
+	f, err := s.FS.OpenFile("foo", os.O_WRONLY, 0)
+	c.Assert(err, IsNil)
+
+	_, err = ioutil.ReadAll(f)
+	c.Assert(err, NotNil)
+}
+
+func (s *FilesystemSuite) TestFileSeekstart(c *C) {
+	s.testFileSeek(c, 10, io.SeekStart)
+}
+
+func (s *FilesystemSuite) TestFileSeekCurrent(c *C) {
+	s.testFileSeek(c, 5, io.SeekCurrent)
+}
+
+func (s *FilesystemSuite) TestFileSeekEnd(c *C) {
+	s.testFileSeek(c, -26, io.SeekEnd)
+}
+
+func (s *FilesystemSuite) testFileSeek(c *C, offset int64, whence int) {
 	err := WriteFile(s.FS, "foo", []byte("0123456789abcdefghijklmnopqrstuvwxyz"), 0644)
 	c.Assert(err, IsNil)
 
 	f, err := s.FS.Open("foo")
 	c.Assert(err, IsNil)
 
-	p, err := f.Seek(10, io.SeekStart)
+	some := make([]byte, 5)
+	_, err = f.Read(some)
+	c.Assert(err, IsNil)
+	c.Assert(string(some), Equals, "01234")
+
+	p, err := f.Seek(offset, whence)
 	c.Assert(err, IsNil)
 	c.Assert(int(p), Equals, 10)
 
 	all, err := ioutil.ReadAll(f)
 	c.Assert(err, IsNil)
+	c.Assert(all, HasLen, 26)
 	c.Assert(string(all), Equals, "abcdefghijklmnopqrstuvwxyz")
 	c.Assert(f.Close(), IsNil)
 }
 
+func (s *FilesystemSuite) TestFileSeekClosed(c *C) {
+	err := WriteFile(s.FS, "foo", []byte("foo"), 0644)
+	c.Assert(err, IsNil)
+
+	f, err := s.FS.Open("foo")
+	c.Assert(err, IsNil)
+	c.Assert(f.Close(), IsNil)
+
+	_, err = f.Seek(0, 0)
+	c.Assert(err, NotNil)
+}
+
 func (s *FilesystemSuite) TestFileCloseTwice(c *C) {
 	f, err := s.FS.Create("foo")
 	c.Assert(err, IsNil)
@@ -260,6 +359,31 @@
 	c.Assert(info, HasLen, 2)
 }
 
+func (s *FilesystemSuite) TestReadDirAndWithMkDirAll(c *C) {
+	err := s.FS.MkdirAll("qux", 0644)
+	c.Assert(err, IsNil)
+
+	files := []string{"qux/baz", "qux/qux"}
+	for _, name := range files {
+		err := WriteFile(s.FS, name, nil, 0644)
+		c.Assert(err, IsNil)
+	}
+
+	info, err := s.FS.ReadDir("/")
+	c.Assert(err, IsNil)
+	c.Assert(info, HasLen, 1)
+	c.Assert(info[0].IsDir(), Equals, true)
+
+	info, err = s.FS.ReadDir("/qux")
+	c.Assert(err, IsNil)
+	c.Assert(info, HasLen, 2)
+
+	qux := s.FS.Dir("/qux")
+	info, err = qux.ReadDir("/")
+	c.Assert(err, IsNil)
+	c.Assert(info, HasLen, 2)
+}
+
 func (s *FilesystemSuite) TestReadDirFileInfo(c *C) {
 	err := WriteFile(s.FS, "foo", []byte{'F', 'O', 'O'}, 0644)
 	c.Assert(err, IsNil)
@@ -357,6 +481,33 @@
 	c.Assert(err, IsNil)
 }
 
+func (s *FilesystemSuite) TestRenameDir(c *C) {
+	err := s.FS.MkdirAll("foo", 0644)
+	c.Assert(err, IsNil)
+
+	err = WriteFile(s.FS, "foo/bar", nil, 0644)
+	c.Assert(err, IsNil)
+
+	err = s.FS.Rename("foo", "bar")
+	c.Assert(err, IsNil)
+
+	dirfoo, err := s.FS.Stat("foo")
+	c.Assert(dirfoo, IsNil)
+	c.Assert(os.IsNotExist(err), Equals, true)
+
+	dirbar, err := s.FS.Stat("bar")
+	c.Assert(err, IsNil)
+	c.Assert(dirbar, NotNil)
+
+	foo, err := s.FS.Stat("foo/bar")
+	c.Assert(os.IsNotExist(err), Equals, true)
+	c.Assert(foo, IsNil)
+
+	bar, err := s.FS.Stat("bar/bar")
+	c.Assert(err, IsNil)
+	c.Assert(bar, NotNil)
+}
+
 func (s *FilesystemSuite) TestTempFile(c *C) {
 	f, err := s.FS.TempFile("", "bar")
 	c.Assert(err, IsNil)
@@ -585,14 +736,14 @@
 }
 
 func (s *FilesystemSuite) TestMkdirAllIdempotent(c *C) {
-	err := s.FS.MkdirAll("empty", os.FileMode(0755))
+	err := s.FS.MkdirAll("empty", 0755)
 	c.Assert(err, IsNil)
 	fi, err := s.FS.Stat("empty")
 	c.Assert(err, IsNil)
 	c.Assert(fi.IsDir(), Equals, true)
 
 	// idempotent
-	err = s.FS.MkdirAll("empty", os.FileMode(0755))
+	err = s.FS.MkdirAll("empty", 0755)
 	c.Assert(err, IsNil)
 	fi, err = s.FS.Stat("empty")
 	c.Assert(err, IsNil)