# frozen_string_literal: true

RSpec.describe Strings::Truncate, "#truncate" do
  let(:text) { "ラドクリフ、マラソン五輪代表に1万m出場にも含み" }

  it "doesn't change text for 0 length" do
    expect(Strings::Truncate.truncate(text, 0)).to eq(text)
  end

  it "doensn't change text for nil length" do
    expect(Strings::Truncate.truncate(text, nil)).to eq(text)
  end

  it "truncate length of 1 results in just the trailing character" do
    expect(Strings::Truncate.truncate(text, 1)).to eq(Strings::Truncate::DEFAULT_TRAILING)
  end

  it "doesn't change text for equal length" do
    truncation = Strings::Truncate.truncate(text, text.length * 2)
    expect(truncation).to eq(text)
  end

  it "truncates text and displays omission" do
    trailing = "…"
    expect(Strings::Truncate.truncate(text, 12)).to eq("ラドクリフ#{trailing}")
  end

  it "estimates total width correctly " do
    text = "太丸ゴシック体"
    trailing = "…"
    expect(Strings::Truncate.truncate(text, 8)).to eq("太丸ゴ#{trailing}")
  end

  it "doesn't truncate text when length exceeds content" do
    expect(Strings::Truncate.truncate(text, 100)).to eq(text)
  end

  it "doesn't truncate whole words" do
    text = "I know not all that may be coming, but be it what it will, I'll go to it laughing."
    trailing = "…"
    truncation = Strings::Truncate.truncate(text, separator: " ")
    expect(truncation).to eq("I know not all that may be#{trailing}")
  end

  it "truncates text with string separator" do
    trailing = "…"
    truncation = Strings::Truncate.truncate(text, 12, separator: "")
    expect(truncation).to eq("ラドクリフ#{trailing}")
  end

  it "truncates text with regex separator" do
    trailing = "…"
    truncation = Strings::Truncate.truncate(text, 12, separator: /\s/)
    expect(truncation).to eq("ラドクリフ#{trailing}")
  end

  it "truncates text with custom trailing" do
    trailing = "... (see more)"
    truncation = Strings::Truncate.truncate(text, 20, trailing: trailing)
    expect(truncation).to eq("ラド#{trailing}")
  end

  it "correctly truncates with ANSI characters" do
    text = "I try \e[34mall things\e[0m, I achieve what I can"
    truncation = Strings::Truncate.truncate(text, 18)
    expect(truncation).to eq("I try \e[34mall things\e[0m…")
  end

  it "finishes on word boundary" do
    text = "for there is no folly of the beast of the earth"
    truncation = Strings::Truncate.truncate(text, 20, separator: " ")
    expect(truncation).to eq("for there is no…")
  end
end
