summaryrefslogtreecommitdiff
path: root/spec/ruby/core/warning/warn_spec.rb
blob: 8f96fe9287cc8b317d241fd3943eaefadb24275c (plain)
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
require_relative '../../spec_helper'

describe "Warning.warn" do
  it "complains" do
    -> {
      Warning.warn("Chunky bacon!")
    }.should complain("Chunky bacon!")
  end

  it "does not add a newline" do
    ruby_exe("Warning.warn('test')", args: "2>&1").should == "test"
  end

  it "returns nil" do
    ruby_exe("p Warning.warn('test')", args: "2>&1").should == "testnil\n"
  end

  it "extends itself" do
    Warning.singleton_class.ancestors.should include(Warning)
  end

  it "has Warning as the method owner" do
    ruby_exe("p Warning.method(:warn).owner").should == "Warning\n"
  end

  it "can be overridden" do
    code = <<-RUBY
      $stdout.sync = true
      $stderr.sync = true
      def Warning.warn(msg)
        if msg.start_with?("A")
          puts msg.upcase
        else
          super
        end
      end
      Warning.warn("A warning!")
      Warning.warn("warning from stderr\n")
    RUBY
    ruby_exe(code, args: "2>&1").should == %Q[A WARNING!\nwarning from stderr\n]
  end

  it "is called by parser warnings" do
    Warning.should_receive(:warn)
    verbose = $VERBOSE
    $VERBOSE = false
    begin
      eval "{ key: :value, key: :value2 }"
    ensure
      $VERBOSE = verbose
    end
  end

  it "is called by Kernel.warn with nil category keyword" do
    Warning.should_receive(:warn).with("Chunky bacon!\n", category: nil)
    verbose = $VERBOSE
    $VERBOSE = false
    begin
      Kernel.warn("Chunky bacon!")
    ensure
      $VERBOSE = verbose
    end
  end

  it "is called by Kernel.warn with given category keyword converted to a symbol" do
    Warning.should_receive(:warn).with("Chunky bacon!\n", category: :deprecated)
    verbose = $VERBOSE
    $VERBOSE = false
    begin
      Kernel.warn("Chunky bacon!", category: "deprecated")
    ensure
      $VERBOSE = verbose
    end
  end

  it "warns when category is :deprecated and Warning[:deprecated] is true" do
    warn_deprecated = Warning[:deprecated]
    Warning[:deprecated] = true
    begin
      -> {
        Warning.warn("foo", category: :deprecated)
      }.should complain("foo")
    ensure
      Warning[:deprecated] = warn_deprecated
    end
  end

  it "warns when category is :experimental and Warning[:experimental] is true" do
    warn_experimental = Warning[:experimental]
    Warning[:experimental] = true
    begin
      -> {
        Warning.warn("foo", category: :experimental)
      }.should complain("foo")
    ensure
      Warning[:experimental] = warn_experimental
    end
  end

  it "doesn't print message when category is :deprecated but Warning[:deprecated] is false" do
    warn_deprecated = Warning[:deprecated]
    Warning[:deprecated] = false
    begin
      -> {
        Warning.warn("foo", category: :deprecated)
      }.should_not complain
    ensure
      Warning[:deprecated] = warn_deprecated
    end
  end

  it "doesn't print message when category is :experimental but Warning[:experimental] is false" do
    warn_experimental = Warning[:experimental]
    Warning[:experimental] = false
    begin
      -> {
        Warning.warn("foo", category: :experimental)
      }.should_not complain
    ensure
      Warning[:experimental] = warn_experimental
    end
  end

  it "prints the message when VERBOSE is false" do
    -> { Warning.warn("foo") }.should complain("foo")
  end

  it "prints the message when VERBOSE is nil" do
    -> { Warning.warn("foo") }.should complain("foo", verbose: nil)
  end

  it "prints the message when VERBOSE is true" do
    -> { Warning.warn("foo") }.should complain("foo", verbose: true)
  end
end