pcall(require, "luacov")

local utils = require("nui.layout.utils")
local h = require("tests.helpers")

local eq = h.eq

describe("nui.layout", function()
  describe("utils", function()
    describe("parse_relative", function()
      local fallback_winid = 17

      it("works for type=buf", function()
        local relative = {
          type = "buf",
          position = { row = 2, col = 4 },
          winid = 42,
        }

        local result = utils.parse_relative(relative, fallback_winid)

        eq(result, {
          relative = "win",
          win = relative.winid,
          bufpos = {
            relative.position.row,
            relative.position.col,
          },
        })
      end)

      it("works for type=cursor", function()
        local relative = {
          type = "cursor",
          winid = 42,
        }

        local result = utils.parse_relative(relative, fallback_winid)

        eq(result, {
          relative = relative.type,
          win = relative.winid,
        })
      end)

      it("works for type=editor", function()
        local relative = {
          type = "editor",
          winid = 42,
        }

        local result = utils.parse_relative(relative, fallback_winid)

        eq(result, {
          relative = relative.type,
          win = relative.winid,
        })
      end)

      it("works for type=win", function()
        local relative = {
          type = "win",
          winid = 42,
        }

        local result = utils.parse_relative(relative, fallback_winid)

        eq(result, {
          relative = relative.type,
          win = relative.winid,
        })
      end)

      it("uses fallback_winid if relative.winid is nil", function()
        local relative = {
          type = "win",
        }

        local result = utils.parse_relative(relative, fallback_winid)

        eq(result, {
          relative = relative.type,
          win = fallback_winid,
        })
      end)
    end)

    describe("get_container_info", function()
      it("works for relative=editor", function()
        local result = utils.get_container_info({
          relative = "editor",
        })

        eq(result, {
          relative = "editor",
          size = {
            width = vim.o.columns,
            height = vim.o.lines,
          },
          type = "editor",
        })
      end)

      it("works for relative=cursor", function()
        local winid = vim.api.nvim_get_current_win()

        local result = utils.get_container_info({
          relative = "cursor",
          win = 0,
        })

        eq(result, {
          relative = "cursor",
          size = {
            width = vim.api.nvim_win_get_width(winid),
            height = vim.api.nvim_win_get_height(winid),
          },
          type = "window",
          winid = winid,
        })
      end)

      it("works for relative=win w/ bufpos", function()
        local winid = vim.api.nvim_get_current_win()

        local result = utils.get_container_info({
          relative = "win",
          win = winid,
          bufpos = { 2, 4 },
        })

        eq(result, {
          relative = "buf",
          size = {
            width = vim.api.nvim_win_get_width(winid),
            height = vim.api.nvim_win_get_height(winid),
          },
          type = "window",
          winid = winid,
        })
      end)
    end)
  end)
end)
