package acl

import (
	"os"
	"reflect"
	"syscall"
	"testing"

	"hakurei.app/container"
)

func TestNewAclPathError(t *testing.T) {
	testCases := []struct {
		name string
		path string
		r    int
		err  error
		want error
	}{
		{"nil", container.Nonexistent, 0, syscall.ENOTRECOVERABLE, nil},

		{"acl_get_file", container.Nonexistent, -1, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_get_file", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_get_tag_type", container.Nonexistent, -2, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_get_tag_type", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_get_qualifier", container.Nonexistent, -3, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_get_qualifier", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_delete_entry", container.Nonexistent, -4, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_delete_entry", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_create_entry", container.Nonexistent, -5, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_create_entry", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_get_permset", container.Nonexistent, -6, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_get_permset", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_add_perm", container.Nonexistent, -7, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_add_perm", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_set_tag_type", container.Nonexistent, -8, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_set_tag_type", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_set_qualifier", container.Nonexistent, -9, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_set_qualifier", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_calc_mask", container.Nonexistent, -10, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_calc_mask", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_valid", container.Nonexistent, -11, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_valid", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"acl_set_file", container.Nonexistent, -12, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "acl_set_file", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},

		{"acl", container.Nonexistent, -13, syscall.ENOTRECOVERABLE,
			&os.PathError{Op: "setfacl", Path: container.Nonexistent, Err: syscall.ENOTRECOVERABLE}},
		{"invalid", container.Nonexistent, -0xdead, nil,
			&os.PathError{Op: "setfacl", Path: container.Nonexistent}},
	}
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			err := newAclPathError(tc.path, tc.r, tc.err)
			if !reflect.DeepEqual(err, tc.want) {
				t.Errorf("newAclPathError: %v, want %v", err, tc.want)
			}
		})
	}
}
