aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/kernel_test.rb
blob: 18b251173f9e300f0838920186e5edb894c49aae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
require 'abstract_unit'
require 'active_support/core_ext/kernel'

class KernelTest < ActiveSupport::TestCase
  def test_silence_warnings
    silence_warnings { assert_nil $VERBOSE }
    assert_equal 1234, silence_warnings { 1234 }
  end

  def test_silence_warnings_verbose_invariant
    old_verbose = $VERBOSE
    silence_warnings { raise }
    flunk
  rescue
    assert_equal old_verbose, $VERBOSE
  end


  def test_enable_warnings
    enable_warnings { assert_equal true, $VERBOSE }
    assert_equal 1234, enable_warnings { 1234 }
  end

  def test_enable_warnings_verbose_invariant
    old_verbose = $VERBOSE
    enable_warnings { raise }
    flunk
  rescue
    assert_equal old_verbose, $VERBOSE
  end


  def test_silence_stderr
    old_stderr_position = STDERR.tell
    silence_stderr { STDERR.puts 'hello world' }
    assert_equal old_stderr_position, STDERR.tell
  rescue Errno::ESPIPE
    # Skip if we can't STDERR.tell
  end

  def test_silence_stream
    old_stream_position = STDOUT.tell
    silence_stream(STDOUT) { STDOUT.puts 'hello world' }
    assert_equal old_stream_position, STDOUT.tell
  rescue Errno::ESPIPE
    # Skip if we can't stream.tell
  end

  def test_silence_stream_closes_file_descriptors
    stream     = StringIO.new
    dup_stream = StringIO.new
    stream.stubs(:dup).returns(dup_stream)
    dup_stream.expects(:close)
    silence_stream(stream) { stream.puts 'hello world' }
  end

  def test_quietly
    old_stdout_position, old_stderr_position = STDOUT.tell, STDERR.tell
    quietly do
      puts 'see me, feel me'
      STDERR.puts 'touch me, heal me'
    end
    assert_equal old_stdout_position, STDOUT.tell
    assert_equal old_stderr_position, STDERR.tell
  rescue Errno::ESPIPE
    # Skip if we can't STDERR.tell
  end

  def test_silence_stderr_with_return_value
    assert_equal 1, silence_stderr { 1 }
  end

  def test_class_eval
    o = Object.new
    class << o; @x = 1; end
    assert_equal 1, o.class_eval { @x }
  end

  def test_capture
    assert_equal 'STDERR', capture(:stderr) { $stderr.print 'STDERR' }
    assert_equal 'STDOUT', capture(:stdout) { print 'STDOUT' }
    assert_equal "STDERR\n", capture(:stderr) { system('echo STDERR 1>&2') }
    assert_equal "STDOUT\n", capture(:stdout) { system('echo STDOUT') }
  end
end

class KernelSuppressTest < ActiveSupport::TestCase
  def test_reraise
    assert_raise(LoadError) do
      suppress(ArgumentError) { raise LoadError }
    end
  end

  def test_suppression
    suppress(ArgumentError) { raise ArgumentError }
    suppress(LoadError) { raise LoadError }
    suppress(LoadError, ArgumentError) { raise LoadError }
    suppress(LoadError, ArgumentError) { raise ArgumentError }
  end
end

class MockStdErr
  attr_reader :output
  def puts(message)
    @output ||= []
    @output << message
  end

  def info(message)
    puts(message)
  end

  def write(message)
    puts(message)
  end
end

class KernelDebuggerTest < ActiveSupport::TestCase
  def test_debugger_not_available_message_to_stderr
    old_stderr = $stderr
    $stderr = MockStdErr.new
    debugger
    assert_match(/Debugger requested/, $stderr.output.first)
  ensure
    $stderr = old_stderr
  end

  def test_debugger_not_available_message_to_rails_logger
    rails = Class.new do
      def self.logger
        @logger ||= MockStdErr.new
      end
    end
    Object.const_set(:Rails, rails)
    debugger
    assert_match(/Debugger requested/, rails.logger.output.first)
  ensure
    Object.send(:remove_const, :Rails)
  end
end