require_relative '../../../test_helper'

module Vedeu
  describe Terminal do
    let(:described_class)    { Terminal }
    let(:console)  { stub }

    before do
      IO.stubs(:console).returns(console)
      console.stubs(:winsize).returns([25, 80])
    end

    describe '.input' do
      before  { console.stubs(:gets).returns("test") }

      subject { described_class.input }

      it { subject.must_be_instance_of(String) }
    end

    describe '.output' do
      before { console.stubs(:puts).returns("test") }

      subject { described_class.output }

      it { subject.must_be_instance_of(String) }
    end

    describe '.width' do
      subject { described_class.width }

      it { subject.must_be_instance_of(Fixnum) }

      it 'returns the width of the terminal' do
        subject.must_equal(80)
      end
    end

    describe '.height' do
      subject { described_class.height }

      it { subject.must_be_instance_of(Fixnum) }

      it 'returns the height of the terminal' do
        subject.must_equal(25)
      end
    end

    describe '.size' do
      subject { described_class.size }

      it { subject.must_be_instance_of(Array) }

      it 'returns the width and height of the terminal' do
        subject.must_equal([25, 80])
      end
    end

    describe '.open' do
      subject { described_class.open }

      it { skip }
    end

    describe '.close' do
      subject { described_class.close }

      it { skip }
    end

    describe '.cooked' do
      subject { described_class.cooked }

      it { skip }
    end

    describe '.raw' do
      subject { described_class.raw }

      it { skip }
    end

    describe '.console' do
      subject { described_class.console }

      it { skip }
    end

    describe '.clear_screen' do
      before do
        Esc.stubs(:clear).returns('')
        console.stubs(:puts)
      end

      subject { described_class.clear_screen }

      it { subject.must_be_instance_of(NilClass) }

      context 'capturing output' do
        let(:io) { capture_io { subject }.join }

        it { io.must_be_instance_of(String) }
      end
    end

    describe '.show_cursor' do
      before { console.stubs(:puts) }

      subject { described_class.show_cursor }

      it { subject.must_be_instance_of(NilClass) }

      context 'capturing output' do
        let(:io) { capture_io { subject }.join }

        it { io.must_be_instance_of(String) }
      end
    end

    describe '.hide_cursor' do
      before { console.stubs(:puts) }

      subject { described_class.hide_cursor }

      it { subject.must_be_instance_of(NilClass) }

      context 'capturing output' do
        let(:io) { capture_io { subject }.join }

        it { io.must_be_instance_of(String) }
      end
    end

    describe '#initial_setup!' do
      subject { described_class.new.initial_setup! }

      it { skip }
    end
  end
end