require 'cucumber/term/banner'

describe Cucumber::Term::Banner do
  include Cucumber::Term::Banner

  context '.display_banner' do
    let(:io) { StringIO.new }

    context 'when a string is provided' do
      it 'outputs a nice banner to IO surrounded by a bold green border' do
        display_banner('Oh, this is a banner', io)
        io.rewind
        expect(io.read).to eq(<<~BANNER)
          \e[1m\e[32m┌──────────────────────┐\e[0m\e[0m
          \e[1m\e[32m│\e[0m\e[0m Oh, this is a banner \e[1m\e[32m│\e[0m\e[0m
          \e[1m\e[32m└──────────────────────┘\e[0m\e[0m
        BANNER
      end

      it 'supports multi-lines' do
        display_banner("Oh, this is a banner\nwhich spreads on\nmultiple lines", io, [])
        io.rewind
        expect(io.read).to eq(<<~BANNER)
          ┌──────────────────────┐
          │ Oh, this is a banner │
          │ which spreads on     │
          │ multiple lines       │
          └──────────────────────┘
        BANNER
      end
    end

    context 'when an array is provided' do
      it 'outputs a nice banner with each item on a line' do
        display_banner(
          [
            'Oh, this is a banner',
            'It has two lines'
          ],
          io,
          []
        )
        io.rewind
        expect(io.read).to eq(<<~BANNER)
          ┌──────────────────────┐
          │ Oh, this is a banner │
          │ It has two lines     │
          └──────────────────────┘
        BANNER
      end

      context 'when specifying spans' do
        it 'can render special characters inside the lines' do
          display_banner(
            [
              'Oh, this is a banner',
              ['It has ', ['two', :bold, :blue], ' lines']
            ],
            io,
            []
          )

          io.rewind
          expect(io.read).to eq(<<~BANNER)
            ┌──────────────────────┐
            │ Oh, this is a banner │
            │ It has \e[34m\e[1mtwo\e[0m\e[0m lines     │
            └──────────────────────┘
          BANNER
        end
      end
    end

    context 'with custom borders' do
      it 'process the border with the provided attributes' do
        display_banner('this is a banner', io, %i[bold blue])

        io.rewind
        expect(io.read).to eq(<<~BANNER)
          \e[34m\e[1m┌──────────────────┐\e[0m\e[0m
          \e[34m\e[1m│\e[0m\e[0m this is a banner \e[34m\e[1m│\e[0m\e[0m
          \e[34m\e[1m└──────────────────┘\e[0m\e[0m
        BANNER
      end
    end
  end
end
