pcall(require, "luacov")

local ns_id = require("neo-tree.ui.highlights").ns_id
local u = require("tests.utils")

local config = {
  renderers = {
    directory = {
      {
        "container",
        content = {
          { "indent", zindex = 10 },
          { "icon", zindex = 10 },
          { "name", zindex = 10 },
          { "name", zindex = 5, align = "right" },
        },
      },
    },
    file = {
      {
        "container",
        content = {
          { "indent", zindex = 10 },
          { "icon", zindex = 10 },
          { "name", zindex = 10 },
          { "name", zindex = 20, align = "right" },
        },
      },
    },
  },
  window = {
    width = 40,
  },
}

local config_right = {
  renderers = {
    directory = {
      {
        "container",
        enable_character_fade = false,
        content = {
          { "indent", zindex = 10, align = "right" },
          { "icon", zindex = 10, align = "right" },
          { "name", zindex = 10, align = "right" },
        },
      },
    },
    file = {
      {
        "container",
        enable_character_fade = false,
        content = {
          { "indent", zindex = 10, align = "right" },
          { "icon", zindex = 10, align = "right" },
          { "name", zindex = 10, align = "right" },
        },
      },
    },
  },
  window = {
    width = 40,
  },
}

local test_dir = {
  items = {
    {
      name = "foo",
      type = "dir",
      items = {
        {
          name = "bar",
          type = "dir",
          items = {
            { name = "bar1.txt", type = "file" },
            { name = "bar2.txt", type = "file" },
          },
        },
        { name = "foo1.lua", type = "file" },
      },
    },
    { name = "bazbazbazbazbazbazbazbazbazbazbazbazbazbazbazbazbaz", type = "dir" },
    { name = "1.md", type = "file" },
  },
}

describe("sources/components/container", function()
  local req_switch = u.get_require_switch()

  local test = u.fs.init_test(test_dir)
  test.setup()

  after_each(function()
    if req_switch then
      req_switch.restore()
    end

    u.clear_environment()
  end)

  describe("should expand to width", function()
    for pow = 4, 8 do
      it(2 ^ pow, function()
        config.window.width = 2 ^ pow
        require("neo-tree").setup(config)
        vim.cmd([[Neotree focus]])
        u.wait_for(function()
          return vim.bo.filetype == "neo-tree"
        end)

        assert.equals(vim.bo.filetype, "neo-tree")

        local width = vim.api.nvim_win_get_width(0)
        local lines = vim.api.nvim_buf_get_lines(0, 2, -1, false)
        for _, line in ipairs(lines) do
          assert.is_true(#line >= width)
        end
      end)
    end
  end)

  describe("right-align should matches width", function()
    for pow = 4, 8 do
      it(2 ^ pow, function()
        config_right.window.width = 2 ^ pow
        require("neo-tree").setup(config_right)
        vim.cmd([[Neotree focus]])
        u.wait_for(function()
          return vim.bo.filetype == "neo-tree"
        end)

        assert.equals(vim.bo.filetype, "neo-tree")

        local width = vim.api.nvim_win_get_width(0)
        local lines = vim.api.nvim_buf_get_lines(0, 1, -1, false)
        for _, line in ipairs(lines) do
          line = vim.fn.trim(line, " ", 2)
          assert.equals(width, vim.fn.strchars(line))
        end
      end)
    end
  end)

  test.teardown()
end)