package fileutil

import (
	"bytes"
	"fmt"
	"os"
	"path"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestIsReadableFile(t *testing.T) {
	tests := []struct {
		name    string
		args    string
		want    bool
		wantErr bool
	}{
		{"good file", "fileutil.go", true, false},
		{"file doesn't exist", "file-no-exist/nope", false, false},
		{"can't read dir", "./", false, true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := IsReadableFile(tt.args)
			if (err != nil) != tt.wantErr {
				t.Errorf("IsReadableFile() error = %+v, wantErr %v", err, tt.wantErr)
				return
			}
			if got != tt.want {
				t.Errorf("IsReadableFile() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestGetwd(t *testing.T) {
	tests := []struct {
		name string
		want string
	}{
		{"most basic example", "internal/fileutil"},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := Getwd(); strings.Contains(tt.want, got) {
				t.Errorf("Getwd() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestReadFileUpTo(t *testing.T) {
	d := t.TempDir()
	input := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
	fname := path.Join(d, "test")
	require.NoError(t, os.WriteFile(fname, input, 0600))

	for _, tc := range []struct {
		size        int
		expectError bool
	}{
		{len(input) - 1, true},
		{len(input), false},
		{len(input) + 1, false},
	} {
		t.Run(fmt.Sprint(tc), func(t *testing.T) {
			out, err := ReadFileUpTo(fname, int64(tc.size))
			if tc.expectError {
				require.Error(t, err)
				return
			}
			require.NoError(t, err)
			assert.True(t, bytes.Equal(input, out))
		})
	}
}