specify posix:grp:
- before:
    grp = require "posix.grp"


- describe endgrent:
  - before:
      endgrent = grp.endgrent

  - context with bad arguments:
      badargs.diagnose (endgrent, "()")

  - it returns 'nil':
      expect (endgrent ()).to_be (nil)
  - it rewinds the group database:
      g = grp.getgrent ()
      grp.getgrent ()
      endgrent ()
      expect (grp.getgrent ()).to_equal (g)


- describe getgrent:
  - before:
      getgrent = grp.getgrent

  - context with bad arguments:
      badargs.diagnose (getgrent, "()")

  - it returns a PosixGroup for an existing group:
      expect (prototype (getgrent ())).to_be "PosixGroup"
  - it fetches a different group on subsequent calls:
      g = getgrent ()
      expect (getgrent ()).not_to_equal (g)
  - it returns nil after the last entry was fetched:
      g = getgrent ()
      while (g) do
        h = getgrent ()
        expect (g).not_to_equal (h)
        g = h
      end
      expect (g).to_be (nil)
      grp.endgrent ()


- describe getgrgid:
  - before:
      getgrgid = posix.getgrgid
      groot = getgrgid (0).gr_name

  - context with bad arguments:
      badargs.diagnose (getgrgid, "(int)")

  - it returns a PosixGroup for an existing group:
      expect (prototype (getgrgid (0))).to_be "PosixGroup"
  - it fetches a group by gid:
      expect (getgrgid (0).gr_name).to_be (groot)
      expect (getgrgid (0).gr_gid).to_be (0)
      expect (type (getgrgid (0).gr_mem)).to_be "table"


- describe getgrnam:
  - before:
      getgrgid, getgrnam = posix.getgrgid, posix.getgrnam
      groot = getgrgid (0).gr_name

  - context with bad arguments:
      badargs.diagnose (getgrnam, "(string)")

  - it returns 'nil' for a non-existent group:
      expect (getgrnam "veryunlikelygroupname").to_be (nil)
  - it returns a PosixGroup for an existing group:
      expect (prototype (getgrnam (groot))).to_be "PosixGroup"
  - it fetches a group by name:
      expect (getgrnam (groot).gr_name).to_be (groot)
      expect (getgrnam (groot).gr_gid).to_be (0)
      expect (type (getgrnam (groot).gr_mem)).to_be "table"


- describe setgrent:
  - before:
      setgrent = grp.setgrent

  - context with bad arguments:
      badargs.diagnose (setgrent, "()")

  - it returns 'nil':
      expect (setgrent ()).to_be (nil)
  - it rewinds the group database:
      g = grp.getgrent ()
      grp.getgrent ()
      setgrent ()
      expect (grp.getgrent ()).to_equal (g)
