class Slightish::TestCase

Attributes

actual_error_output[R]
actual_exit_code[R]
actual_output[R]
command[R]
end_line[RW]
expected_error_output[R]
expected_exit_code[RW]
expected_output[R]
raw_command[R]
raw_expected_error_output[R]
raw_expected_output[R]
source_file[R]
start_line[RW]

Public Class Methods

new(source_file) click to toggle source
# File lib/slightish/test_case.rb, line 12
def initialize(source_file)
  @source_file = source_file
  @expected_exit_code = 0

  @start_line = @end_line = -1
  @raw_command = @command = nil
  @raw_expected_output = @expected_output = nil
  @raw_expected_error_output = @expected_error_output = nil
  @actual_output = @actual_error_output = nil
  @actual_exit_code = nil
end

Public Instance Methods

append_command(str) click to toggle source
# File lib/slightish/test_case.rb, line 69
def append_command(str)
  if @raw_command.nil?
    @raw_command = str
  else
    # bash eats newlines from multiline strings, so no \n here
    # For example:
    # "echo a\
    # b"
    # produces "ab"
    @raw_command += str
  end
end
append_expected_error_output(str) click to toggle source
# File lib/slightish/test_case.rb, line 90
def append_expected_error_output(str)
  if @raw_expected_error_output.nil?
    @raw_expected_error_output = str
  else
    @raw_expected_error_output += "\n" + str
  end
end
append_expected_output(str) click to toggle source
# File lib/slightish/test_case.rb, line 82
def append_expected_output(str)
  if @raw_expected_output.nil?
    @raw_expected_output = str
  else
    @raw_expected_output += "\n" + str
  end
end
failed?() click to toggle source
# File lib/slightish/test_case.rb, line 39
def failed?
  !passed?
end
failure_description() click to toggle source
# File lib/slightish/test_case.rb, line 43
def failure_description
  res = ''
  res += output_failure_description('stdout', @expected_output, @actual_output) unless @expected_output == @actual_output

  if @expected_error_output != @actual_error_output
    res += "\n\n" unless res.empty?
    res += output_failure_description('stderr', @expected_error_output, @actual_error_output)
  end

  if @actual_exit_code != @expected_exit_code
    res += "\n\n" unless res.empty?
    res += 'Expected exit code: '.red.bold + @expected_exit_code.to_s.gray + "\n"
    res += 'Actual exit code: '.green.bold + @actual_exit_code.to_s.gray
  end

  res
end
passed?() click to toggle source
# File lib/slightish/test_case.rb, line 33
def passed?
  @actual_output == @expected_output &&
    @actual_error_output == @expected_error_output &&
    @actual_exit_code == @expected_exit_code
end
run(sandbox) click to toggle source
# File lib/slightish/test_case.rb, line 24
def run(sandbox)
  expand(sandbox)

  @actual_output, @actual_error_output, process_status = Open3.capture3(@command, { chdir: sandbox.path })
  @actual_output.chomp!
  @actual_error_output.chomp!
  @actual_exit_code = process_status.exitstatus
end
source_description() click to toggle source
# File lib/slightish/test_case.rb, line 61
def source_description
  if @start_line == @end_line
    "#{@source_file}:#{@start_line}"
  else
    "#{@source_file}:#{@start_line}-#{@end_line}"
  end
end

Private Instance Methods

expand(sandbox) click to toggle source
# File lib/slightish/test_case.rb, line 120
def expand(sandbox)
  @command = @raw_command.expand(chdir: sandbox.path, source: source_description)
  @expected_output = (@raw_expected_output || '').expand(chdir: sandbox.path, source: source_description)
  @expected_error_output = (@raw_expected_error_output || '').expand(chdir: sandbox.path, source: source_description)
end
output_failure_description(name, expected, actual) click to toggle source
# File lib/slightish/test_case.rb, line 100
def output_failure_description(name, expected, actual)
  res = ''

  if expected.empty?
    res += "Expected #{name}: empty\n".red.bold
  else
    res += "Expected #{name}:\n".red.bold
    res += expected.gray + "\n"
  end

  if actual.empty?
    res += "Actual #{name}: empty".green.bold
  else
    res += "Actual #{name}:\n".green.bold
    res += actual.gray
  end

  res
end