describe 'the `completion` suggestion strategy' do
  let(:options) { ['ZSH_AUTOSUGGEST_STRATEGY=completion'] }
  let(:before_sourcing) do
    -> do
      session.
        run_command('autoload compinit && compinit').
        run_command('_foo() { compadd bar; compadd bat }').
        run_command('_num() { compadd two; compadd three }').
        run_command('compdef _foo baz').
        run_command('compdef _num one')
    end
  end

  it 'suggests the first completion result' do
    session.send_string('baz ')
    wait_for { session.content }.to eq('baz bar')
  end

  it 'does not add extra carriage returns when prefix has a line feed' do
    skip '`stty` does not work inside zpty below zsh version 5.0.3' if session.zsh_version < Gem::Version.new('5.0.3')
    session.send_string('baz \\').send_keys('C-v', 'C-j')
    wait_for { session.content }.to eq("baz \\\nbar")
  end

  context 'when `_complete` is aliased' do
    let(:before_sourcing) do
      -> do
        session.
          run_command('autoload compinit && compinit').
          run_command('_foo() { compadd bar; compadd bat }').
          run_command('compdef _foo baz').
          run_command('alias _complete=_complete')
      end
    end

    it 'suggests the first completion result' do
      session.send_string('baz ')
      wait_for { session.content }.to eq('baz bar')
    end
  end

  context 'when ZSH_AUTOSUGGEST_COMPLETION_IGNORE is set to a pattern' do
    let(:options) { ['ZSH_AUTOSUGGEST_STRATEGY=completion', 'ZSH_AUTOSUGGEST_COMPLETION_IGNORE="one *"'] }

    it 'makes suggestions when the buffer does not match the pattern' do
      session.send_string('baz ')
      wait_for { session.content }.to eq('baz bar')
    end

    it 'does not make suggestions when the buffer matches the pattern' do
      session.send_string('one t')
      sleep 1
      expect(session.content).to eq('one t')
    end
  end

  context 'when async mode is enabled' do
    let(:options) { ['ZSH_AUTOSUGGEST_USE_ASYNC=true', 'ZSH_AUTOSUGGEST_STRATEGY=completion'] }

    it 'suggests the first completion result' do
      session.send_string('baz ')
      wait_for { session.content }.to eq('baz bar')
    end

    it 'does not add extra carriage returns when prefix has a line feed' do
      skip '`stty` does not work inside zpty below zsh version 5.0.3' if session.zsh_version < Gem::Version.new('5.0.3')
      session.send_string('baz \\').send_keys('C-v', 'C-j')
      wait_for { session.content }.to eq("baz \\\nbar")
    end
  end
end