# frozen_string_literal: true

RSpec.describe TTY::Command, ":pty" do
  it "executes command in pseudo terminal mode as global option",
     unless: RSpec::Support::OS.windows? do
    color_cli = fixtures_path("color")
    output = StringIO.new
    cmd = TTY::Command.new(output: output, pty: true)

    out, err = cmd.run(color_cli)

    expect(err).to eq("")
    expect(out).to eq("\e[32mcolored\e[0m\n")
  end

  it "executes command in pseudo terminal mode as command option",
      unless: RSpec::Support::OS.windows? do
    color_cli = fixtures_path("color")
    output = StringIO.new
    cmd = TTY::Command.new(output: output)

    out, err = cmd.run(color_cli, pty: true)

    expect(err).to eq("")
    expect(out).to eq("\e[32mcolored\e[0m\n")
  end

  it "logs phased output in pseudo terminal mode",
      unless: RSpec::Support::OS.windows? do
    phased_output = fixtures_path("phased_output")
    uuid = "xxxx"
    allow(SecureRandom).to receive(:uuid).and_return(uuid)
    output = StringIO.new
    cmd = TTY::Command.new(output: output)

    out, err = cmd.run("ruby #{phased_output}", pty: true)

    expect(out).to eq("." * 10)
    expect(err).to eq("")

    output.rewind
    lines = output.readlines
    lines.last.gsub!(/\d+\.\d+/, "x")
    expect(lines).to eq([
      "[\e[32m#{uuid}\e[0m] Running \e[33;1mruby #{phased_output}\e[0m\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] \t.\n",
      "[\e[32m#{uuid}\e[0m] Finished in x seconds with exit status 0 (\e[32;1msuccessful\e[0m)\n"
    ])
  end
end
