require 'test_helper'

module Vedeu

  module EscapeSequences

    describe Colours do

      let(:described) { Vedeu::EscapeSequences::Colours }

      describe 'foreground colour methods' do
        it { described.black.must_equal("\e[30m") }
        it { described.red.must_equal("\e[31m") }
        it { described.green.must_equal("\e[32m") }
        it { described.yellow.must_equal("\e[33m") }
        it { described.blue.must_equal("\e[34m") }
        it { described.magenta.must_equal("\e[35m") }
        it { described.cyan.must_equal("\e[36m") }
        it { described.light_grey.must_equal("\e[37m") }
        it { described.default.must_equal("\e[39m") }
        it { described.dark_grey.must_equal("\e[90m") }
        it { described.light_red.must_equal("\e[91m") }
        it { described.light_green.must_equal("\e[92m") }
        it { described.light_yellow.must_equal("\e[93m") }
        it { described.light_blue.must_equal("\e[94m") }
        it { described.light_magenta.must_equal("\e[95m") }
        it { described.light_cyan.must_equal("\e[96m") }
        it { described.white.must_equal("\e[97m") }

        it 'returns an escape sequence for the foreground colour and resets ' \
           'after calling the block' do
          described.cyan do
            'ununpentium'
          end.must_equal("\e[36mununpentium\e[39m")
        end
      end

      describe '.codes' do
        it { described.codes.must_be_instance_of(Hash) }
        it { described.must_respond_to(:foreground_codes) }
      end

      describe '.background_codes' do
        let(:expected) {
          {
            black:         40,
            red:           41,
            green:         42,
            yellow:        43,
            blue:          44,
            magenta:       45,
            cyan:          46,
            light_grey:    47,
            default:       49,
            dark_grey:     100,
            light_red:     101,
            light_green:   102,
            light_yellow:  103,
            light_blue:    104,
            light_magenta: 105,
            light_cyan:    106,
            white:         107,
          }
        }

        it { described.background_codes.must_be_instance_of(Hash) }
        it { described.background_codes.must_equal(expected) }
      end

      describe '.foreground_codes' do
        let(:expected) {
          {
            black:         30,
            red:           31,
            green:         32,
            yellow:        33,
            blue:          34,
            magenta:       35,
            cyan:          36,
            light_grey:    37,
            default:       39,
            dark_grey:     90,
            light_red:     91,
            light_green:   92,
            light_yellow:  93,
            light_blue:    94,
            light_magenta: 95,
            light_cyan:    96,
            white:         97,
          }
        }

        it { described.foreground_codes.must_be_instance_of(Hash) }
        it { described.foreground_codes.must_equal(expected) }
      end

      describe 'background colour methods' do
        it { described.on_black.must_equal("\e[40m") }
        it { described.on_red.must_equal("\e[41m") }
        it { described.on_green.must_equal("\e[42m") }
        it { described.on_yellow.must_equal("\e[43m") }
        it { described.on_blue.must_equal("\e[44m") }
        it { described.on_magenta.must_equal("\e[45m") }
        it { described.on_cyan.must_equal("\e[46m") }
        it { described.on_light_grey.must_equal("\e[47m") }
        it { described.on_default.must_equal("\e[49m") }
        it { described.on_dark_grey.must_equal("\e[100m") }
        it { described.on_light_red.must_equal("\e[101m") }
        it { described.on_light_green.must_equal("\e[102m") }
        it { described.on_light_yellow.must_equal("\e[103m") }
        it { described.on_light_blue.must_equal("\e[104m") }
        it { described.on_light_magenta.must_equal("\e[105m") }
        it { described.on_light_cyan.must_equal("\e[106m") }
        it { described.on_white.must_equal("\e[107m") }

        it 'returns an escape sequence for the background colour and resets ' \
           'after calling the block' do
          described.on_red do
            'livermorium'
          end.must_equal("\e[41mlivermorium\e[49m")
        end
      end

    end # Colours

  end # EscapeSequences

end # Vedeu