specify posix.sys.resource:
- before:
    resource = require "posix.sys.resource"


- describe getrlimit:
  - before:
      getrlimit = resource.getrlimit

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

  - it returns a PosixRlimit:
      expect (prototype (getrlimit (resource.RLIMIT_AS))).to_be "PosixRlimit"
  - it fetches resource limits for a process:
      for _, rc in pairs {"RLIMIT_CORE", "RLIMIT_CPU", "RLIMIT_DATA", "RLIMIT_FSIZE",
          "RLIMIT_NOFILE", "RLIMIT_STACK", "RLIMIT_AS"}
      do
        rlim = getrlimit (resource[rc])
        expect (type (rlim.rlim_cur)).to_be "number"
        expect (type (rlim.rlim_max)).to_be "number"
      end


- describe setrlimit:
  - before:
      setrlimit, typeerrors = init (resource, "setrlimit")
      getrlimit = resource.getrlimit

  - context with bad arguments: |
      badargs.diagnose (setrlimit, "(int, table)")

      examples {
        ["context diagnosing rlimit table fields"] = {
          {
            ["it diagnoses argument #2 missing rlim_cur field"] = function ()
              expect (setrlimit (-1, {})).to_raise.
                any_of (typeerrors (2, "number", "rlim_cur", "no value"))
            end
          },
          {
            ["it diagnoses argument #2 rlim_cur field type not int"] = function ()
              expect (setrlimit (-1, {rlim_cur = false})).to_raise.
                any_of (typeerrors (2, "number", "rlim_cur", "boolean"))
            end
          },
          {
            ["it diagnoses argument #2 missing rlim_max field"] = function ()
              expect (setrlimit (-1, {rlim_cur = -1})).to_raise.
                any_of (typeerrors (2, "number", "rlim_max", "no value"))
            end
          },
          {
            ["it diagnoses argument #2 rlim_max field type not int"] = function ()
              expect (setrlimit (-1, {rlim_cur = -1, rlim_max = false})).to_raise.
                any_of (typeerrors (2, "number", "rlim_max", "boolean"))
            end
          },
          {
            ["it diagnoses argument #2 spurious fields"] = function ()
              expect (setrlimit (-1, {rlim_cur = -1, rlim_max = -1, bogus = false})).
                to_raise.any_of (typeerrors (2, nil, "bogus"))
            end
          },
        }
      }
  - it accepts PosixRlimit argument:
      pending "requires elevated privileges"
      for _, rc in pairs {"RLIMIT_CORE", "RLIMIT_CPU", "RLIMIT_DATA", "RLIMIT_FSIZE",
          "RLIMIT_NOFILE", "RLIMIT_STACK", "RLIMIT_AS"}
      do
        rlim = getrlimit (resource[rc])
        expect (setrlimit (resource[rc], rlim)).to_be (0)
      end
