# frozen_string_literal: true

RSpec.describe Strings::Align, "#align" do
  it "doesn't align unrecognized direction" do
    text = "the madness of men"
    expect {
      Strings::Align.align(text, 22, direction: :unknown)
    }.to raise_error(ArgumentError, /Unknown alignment/)
  end

  it "fills empty" do
    expect(Strings::Align.align("", 22, direction: :center)).to eq("                      ")
  end

  it "centers line" do
    text = "the madness of men"
    expect(Strings::Align.align_center(text, 22)).to eq("  the madness of men  ")
  end

  it "centers unicode characters" do
    text = "こんにちは"
    expect(Strings::Align.align_center(text, 20)).to eq("     こんにちは     ")
  end

  it "centers string with ansi codes" do
    text = "\e[32mthe madness of men\e[0m"
    expect(Strings::Align.align_center(text, 22)).to eq("  \e[32mthe madness of men\e[0m  ")
  end

  it "centers multiline text" do
    text = "for there is no folly of the beast\nof the earth which\nis not infinitely\noutdone by the madness of men"
    expect(Strings::Align.align_center(text, 40)).to eq([
      "   for there is no folly of the beast   \n",
      "           of the earth which           \n",
      "           is not infinitely            \n",
      "     outdone by the madness of men      "
    ].join)
  end

  it "centers multiline text with exact width" do
    text = "the madness \nof men"
    expect(Strings::Align.align_center(text, 12)).to eq([
      "the madness \n",
      "   of men   "
    ].join)
  end

  it "centers multiline unicode text" do
    text = "ラドクリフ\n、マラソン五輪\n代表に1万m出\n場にも含み"
    expect(Strings::Align.align_center(text, 20)).to eq([
      "     ラドクリフ     \n",
      "   、マラソン五輪   \n",
      "    代表に1万m出    \n",
      "     場にも含み     "
    ].join)
  end

  it "centers text with ansi codes" do
    text = "for \e[35mthere\e[0m is no folly of the beast\nof the \e[33mearth\e0m which\nis \e[34mnot infinitely\e[0m\n\e[33moutdone\e[0m by the madness of men"
    expect(Strings::Align.align_center(text, 40)).to eq([
      "   for \e[35mthere\e[0m is no folly of the beast   \n",
      "           of the \e[33mearth\e0m which           \n",
      "           is \e[34mnot infinitely\e[0m            \n",
      "     \e[33moutdone\e[0m by the madness of men      "
    ].join)
  end

  it "centers multiline text with fill character '*'" do
    text = "for there is no folly of the beast\nof the earth which\nis not infinitely\noutdone by the madness of men"
    expect(Strings::Align.align(text, 40, direction: :center, fill: '*')).to eq([
      "***for there is no folly of the beast***\n",
      "***********of the earth which***********\n",
      "***********is not infinitely************\n",
      "*****outdone by the madness of men******"
    ].join)
  end

  it "handles \r\n line separator" do
    text = "Closes #360\r\n\r\nCloses !217"
    expect(Strings::Align.align(text, 27)).to eq([
      "Closes #360                ",
      "                           ",
      "Closes !217                "
    ].join("\r\n"))
  end

  it "handles \r\n line separator and centers" do
    text = "Closes #360\r\n\r\nCloses !217"
    expect(Strings::Align.align_center(text, 27)).to eq([
      "        Closes #360        ",
      "                           ",
      "        Closes !217        "
    ].join("\r\n"))
  end
end
