// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io_test

import (
	.	"io";
		"os";
		"strings";
		"testing";
)

func checkSize(t *testing.T, path string, size uint64) {
	dir, err := os.Stat(path);
	if err != nil {
		t.Fatalf("Stat %q (looking for size %d): %s", path, size, err);
	}
	if dir.Size != size {
		t.Errorf("Stat %q: size %d want %d", path, dir.Size, size);
	}
}

func TestReadFile(t *testing.T) {
	filename := "rumpelstilzchen";
	contents, err := ReadFile(filename);
	if err == nil {
		t.Fatalf("ReadFile %s: error expected, none found", filename);
	}

	filename = "utils_test.go";
	contents, err = ReadFile(filename);
	if err != nil {
		t.Fatalf("ReadFile %s: %v", filename, err);
	}

	checkSize(t, filename, uint64(len(contents)));
}

func TestWriteFile(t *testing.T) {
	filename := "_obj/rumpelstilzchen";
	data := "Programming today is a race between software engineers striving to "
		"build bigger and better idiot-proof programs, and the Universe trying "
		"to produce bigger and better idiots. So far, the Universe is winning.";

	if err := WriteFile(filename, strings.Bytes(data), 0644); err != nil {
		t.Fatalf("WriteFile %s: %v", filename, err);
	}

	contents, err := ReadFile(filename);
	if err != nil {
		t.Fatalf("ReadFile %s: %v", filename, err);
	}

	if string(contents) != data {
		t.Fatalf("contents = %q\nexpected = %q", string(contents), data);
	}

	// cleanup
	os.Remove(filename);	// ignore error
}


func TestReadDir(t *testing.T) {
	dirname := "rumpelstilzchen";
	_, err := ReadDir(dirname);
	if err == nil {
		t.Fatalf("ReadDir %s: error expected, none found", dirname);
	}

	dirname = ".";
	list, err := ReadDir(dirname);
	if err != nil {
		t.Fatalf("ReadDir %s: %v", dirname, err);
	}

	foundTest := false;
	foundObj := false;
	for _, dir := range list {
		switch {
		case dir.IsRegular() && dir.Name == "utils_test.go":
			foundTest = true;
		case dir.IsDirectory() && dir.Name == "_obj":
			foundObj = true;
		}
	}
	if !foundTest {
		t.Fatalf("ReadDir %s: test file not found", dirname);
	}
	if !foundObj {
		t.Fatalf("ReadDir %s: _obj directory not found", dirname);
	}
}
