
if (!is_windows()) {
describe("as_fs_perms (POSIX)", {
  it("coerces integers", {
    expect_equal(as_fs_perms(420L), new_fs_perms(420L))
    expect_equal(as_fs_perms(NA_integer_), new_fs_perms(NA_integer_))

    expect_equal(as_fs_perms(c(511L, 420L)), new_fs_perms(c(511L, 420L)))
  })

  it("coerces doubles to integers", {
    expect_equal(as_fs_perms(420), new_fs_perms(420L))
    expect_equal(as_fs_perms(NA_real_), new_fs_perms(NA_integer_))
    expect_equal(as_fs_perms(c(511, 420)), new_fs_perms(c(511L, 420L)))

    expect_error(as_fs_perms(420.5), "'x' cannot be coerced to class \"fs_perms\"")
  })
  it("coerces octmode", {
    expect_equal(as_fs_perms(as.octmode("777")), new_fs_perms(511L))
    expect_equal(as_fs_perms(as.octmode(c("644", "777"))), new_fs_perms(c(420L, 511L)))
  })
  it("coerces characters in octal notation", {
    expect_equal(as_fs_perms("777"), new_fs_perms(511L))
    expect_equal(as_fs_perms(c("644", "777")), new_fs_perms(c(420L, 511L)))

    expect_error(as_fs_perms("777777"), "Invalid mode '777777'")
  })
  it("coerces characters in symbolic notation", {
    expect_equal(as_fs_perms("a+rwx"), new_fs_perms(511L))
    expect_equal(as_fs_perms(c("u+rw,go+r", "a+rwx")), new_fs_perms(c(420L, 511L)))
  })
  it("coerces characters in symbolic notation", {
    expect_equal(as_fs_perms("rw-r--r--"), new_fs_perms(420L))
    expect_equal(as_fs_perms(c("rw-r--r--", "rwxrwxrwx")), new_fs_perms(c(420L, 511L)))
  })
  it("preserves the class with both subset and subset2", {
    expect_s3_class(as_fs_perms("777")[1], "fs_perms")
    expect_s3_class(as_fs_perms("777")[[1]], "fs_perms")
  })
})

} else {
describe("as_fs_perms (Windows)", {
  skip_on_os(c("mac", "linux", "solaris"))
  it("coerces integers", {
    expect_equal(as_fs_perms(384L), new_fs_perms(384L))
    expect_equal(as_fs_perms(NA_integer_), new_fs_perms(NA_integer_))

    expect_equal(as_fs_perms(c(256L, 384L)), new_fs_perms(c(256L, 384L)))
  })

  it("coerces doubles to integers", {
    expect_equal(as_fs_perms(384), new_fs_perms(384L))
    expect_equal(as_fs_perms(NA_real_), new_fs_perms(NA_integer_))
    expect_equal(as_fs_perms(c(256, 384)), new_fs_perms(c(256L, 384L)))

    expect_error(as_fs_perms(420.5), "'x' cannot be coerced to class \"fs_perms\"")
  })
  it("coerces octmode", {
    expect_equal(as_fs_perms(as.octmode("600")), new_fs_perms(384L))
    expect_equal(as_fs_perms(as.octmode(c("600", "700"))), new_fs_perms(c(384L, 448L)))
    expect_equal(as_fs_perms(as.octmode(c("666", "777"))), new_fs_perms(c(438L, 511L)))
  })
  it("coerces characters in octal notation", {
    expect_equal(as_fs_perms("700"), new_fs_perms(448L))
    expect_equal(as_fs_perms(c("644", "777")), new_fs_perms(c(384L, 448L)))

    #expect_error(as_fs_perms("777777"), "Invalid mode '777777'")
  })
  it("ignores group and other octmode groups", {
    expect_equal(as_fs_perms(c("666", "777")), new_fs_perms(c(384L, 448L)))
  })
  it("coerces characters in symbolic notation", {
    expect_equal(as_fs_perms("a+rw"), new_fs_perms(384L))
    expect_equal(as_fs_perms(c("u+rw", "a+rwx")), new_fs_perms(c(384L, 448L)))
  })
  it("coerces characters in symbolic notation", {
    expect_equal(as_fs_perms("rw-"), new_fs_perms(384L))
    expect_equal(as_fs_perms(c("rw-", "rwx")), new_fs_perms(c(384L, 448L)))
  })
  it("returns 'rwx' on windows", {
    expect_equal(as.character(as_fs_perms("777")), "rwx")
  })
})
}

test_that("common type of double and fs_perms is fs_perms", {
  expect_identical(
    vctrs::vec_ptype2(double(), fs_perms()),
    fs_perms()[0]
  )
  expect_identical(
    vctrs::vec_ptype2(fs_perms(), double()),
    fs_perms()[0]
  )
})

test_that("fs_perms and double are coercible", {
  expect_identical(
    vctrs::vec_cast(1, fs_perms()),
    fs_perms(1)
  )
  expect_identical(
    vctrs::vec_cast(fs_perms(1), double()),
    1L
  )
  expect_identical(
    vctrs::vec_cast(fs_perms(1), fs_perms()),
    fs_perms(1)
  )
})

test_that("can concatenate fs_perms", {
  expect_identical(
    vctrs::vec_c(fs_perms(1), fs_perms(2)),
    as_fs_perms(c(1, 2))
  )
})

test_that("common type of integer and fs_perms is fs_perms", {
  expect_identical(
    vctrs::vec_ptype2(integer(), fs_perms()),
    fs_perms()[0]
  )
  expect_identical(
    vctrs::vec_ptype2(fs_perms(), integer()),
    fs_perms()[0]
  )
})

test_that("fs_perms and integer are coercible", {
  expect_identical(
    vctrs::vec_cast(1L, fs_perms()),
    fs_perms(1L)
  )
  expect_identical(
    vctrs::vec_cast(fs_perms(1L), integer()),
    1L
  )
})

test_that("common type of character and fs_perms is fs_perms", {
  expect_identical(
    vctrs::vec_ptype2(character(), fs_perms()),
    fs_perms()[0]
  )
  expect_identical(
    vctrs::vec_ptype2(fs_perms(), character()),
    fs_perms()[0]
  )
})

test_that("fs_perms and character are coercible", {
  expect_identical(
    vctrs::vec_cast("777", fs_perms()),
    fs_perms("777")
  )

  # This test only return rwx on Windows due to the less fine grained
  # permissions, so we skip it
  skip_on_os("windows")
  expect_identical(
    vctrs::vec_cast(fs_perms("777"), character()),
    "rwxrwxrwx"
  )
})
