# frozen_string_literal: true require 'eac_ruby_utils/console/docopt_runner' require 'eac_cli/runner' RSpec.describe ::EacCli::Runner do let(:runner_class) do the_module = described_class ::Class.new do include the_module runner_definition do arg_opt '-o', '--opt1', 'A arg option.' bool_opt '-o', '--opt2', 'A boolean option' pos_arg :pos1 pos_arg :pos2, repeat: true, optional: true alt do bool_opt '-a', '--opt3', 'A boolean option in a alternative.', required: true end end def run; end end end context 'when all args are supplied' do let(:instance) { runner_class.create(%w[--opt1 aaa --opt2 bbb ccc ddd]) } it { expect(instance.parsed.opt1).to eq('aaa') } it { expect(instance.parsed.opt2?).to eq(true) } it { expect(instance.parsed.pos1).to eq('bbb') } it { expect(instance.parsed.pos2).to eq(%w[ccc ddd]) } end context 'when only required args are supplied' do let(:instance) { runner_class.create(%w[bbb]) } it { expect(instance.parsed.opt1).to be_nil } it { expect(instance.parsed.opt2?).to eq(false) } it { expect(instance.parsed.pos1).to eq('bbb') } it { expect(instance.parsed.pos2).to eq([]) } end context 'when required args are not supplied' do let(:instance) { runner_class.create(%w[]) } it do expect { instance.parsed }.to raise_error(::EacCli::Parser::Error) end end context 'when alternative args are supplied' do let(:instance) { runner_class.create(%w[--opt3]) } it { expect(instance.parsed.opt3?).to eq(true) } end context 'when extra args are not supplied' do let(:runner_class) do the_module = described_class ::Class.new do include the_module runner_definition do pos_arg :pos1 end def run; end end end let(:instance) { runner_class.create(%w[aaa bbb]) } it do expect { instance.parsed }.to raise_error(::EacCli::Parser::Error) end end end