#
# Basic tests of command line options to ruby.
# Run it like:
#
#    $ cmdtest CMDTEST_ruby.rb
#    $ env CMDTEST_RUBY=jruby cmdtest CMDTEST_ruby.rb
#

class CMDTEST_ruby_options < Cmdtest::Testcase

  def ruby
    ENV["CMDTEST_RUBY"] || "ruby"
  end

  #--------------------
  # -C   chdir to a directory before running script

  def test_option_C
    create_file "some/dir/script.rb", [
      'puts "cwd = " + Dir.pwd',
    ]

    # chdir before script
    cmd "#{ruby} -Csome/dir script.rb" do
      stdout_equal [
        /^cwd = .*some\/dir$/,
      ]
    end

    # non-existing dir ---> error
    cmd "#{ruby} -Cnon/existing script.rb" do
      exit_nonzero
      stderr_equal [
        /Can't chdir/,
      ]
    end
  end

  #--------------------
  # -a   auto-split (used with -n or -p)

  def test_option_a
    create_file "a.txt", [
      "a 1  x",
      "b 2 \t y",
      "c 3 ",
    ]

    # with -n
    cmd ["#{ruby}", "-na",  "-e",  "p $F", "a.txt"] do
      stdout_equal [
        '["a", "1", "x"]',
        '["b", "2", "y"]',
        '["c", "3"]',
      ]
    end

    # with -p
    cmd ["#{ruby}", "-pa", "-e", "$_ = $F.inspect; $_ << 10", "a.txt"] do
      stdout_equal [
        '["a", "1", "x"]',
        '["b", "2", "y"]',
        '["c", "3"]',
      ]
    end

  end

  #--------------------
  # -c   check syntax only

  def test_option_c
    # script with no syntax errors
    create_file "script_ok.rb", [
      'puts 123 + 456',
    ]
    cmd "#{ruby} -c script_ok.rb" do
      stdout_equal "Syntax OK\n"
    end

    # script with syntax error
    create_file "script_error.rb", [
      'puts 123 +',
    ]
    cmd "#{ruby} -c script_error.rb" do
      exit_nonzero
      stderr_equal /syntax.*error/i
    end
  end

  #--------------------
  # -d   debug option & $DEBUG

  def test_option_d
    create_file "script.rb", [
      'p $DEBUG',
    ]

    # with -d
    cmd "#{ruby} -d script.rb" do
      stdout_equal "true\n"
    end

    # without -d
    cmd "#{ruby} script.rb" do
      stdout_equal "false\n"
    end
  end

  #--------------------
  # -e   one-line program

  def test_option_e
    # simple case
    cmd "#{ruby} -e 'puts :hello'" do
      stdout_equal "hello\n"
    end

    # several -e options
    cmd "#{ruby} -e 'puts :hello' -e 'puts :world' -e 'puts 123'" do
      stdout_equal [
        "hello",
        "world",
        "123",
      ]
    end

    # ARGV as usual
    cmd "#{ruby} -e 'p ARGV' 11 22 33" do
      stdout_equal [
        '["11", "22", "33"]',
      ]
    end

    # side effects seen in later -e
    cmd ["#{ruby}",  "-e",  "a = []", "-e",  "a << 11",
      "-e", "a << 22", "-e", "p a"] do
      stdout_equal [
        '[11, 22]',
      ]
    end
  end

  #--------------------
  # -h   help

  def test_option_h
    cmd "#{ruby} -h" do
      stdout_equal /^Usage: /
    end
  end

  #--------------------
  # -n   non-printing loop

  def test_option_n
    create_file "a.txt", [
      'line 1',
      'line 2',
      'line 3',
    ]

    # one-line script
    cmd "#{ruby} -n -e 'puts $_ if /[13]/' a.txt" do
      stdout_equal [
        'line 1',
        'line 3',
      ]
    end

    # real script
    create_file "script.rb", [
      'puts $_ if $_ =~ /[13]/',
    ]

    cmd "#{ruby} -n script.rb a.txt" do
      stdout_equal [
        'line 1',
        'line 3',
      ]
    end
  end

  #--------------------
  # -p   printing loop

  def test_option_p
    create_file "a.txt", [
      'line 1',
      'line 2',
      'line 3',
    ]

    # one-line script
    cmd "#{ruby} -p -e 'puts $_ if /[13]/' a.txt" do
      stdout_equal [
        'line 1',
        'line 1',
        'line 2',
        'line 3',
        'line 3',
      ]
    end

    # real script
    create_file "script.rb", [
      'puts $_ if $_ =~ /[13]/',
    ]
    cmd "#{ruby} -p script.rb a.txt" do
      stdout_equal [
        'line 1',
        'line 1',
        'line 2',
        'line 3',
        'line 3',
      ]
    end

    # modifying $_ before automatic print
    cmd ["#{ruby}",  "-p", "-e", "$_ = '...' + $_", "a.txt"] do
      stdout_equal [
        '...line 1',
        '...line 2',
        '...line 3',
      ]
    end
  end

  #--------------------

  def test_option_v
    cmd "#{ruby} -v" do
      stdout_equal [ /^ruby / ]
    end
  end

  #--------------------

  def test_script_on_stdin
    cmd "echo puts :hello_world | ruby" do
      stdout_equal "hello_world\n"
    end

    create_file "script.rb", [
      'puts "hello"',
      'puts "world"',
    ]

    cmd "#{ruby} < script.rb" do
      stdout_equal [
        "hello",
        "world",
      ]
    end
  end

end