summaryrefslogtreecommitdiff
path: root/spec/ruby/core/warning/warn_spec.rb
blob: e2fcfbf93fffd2c53e711580c89e44611945e325 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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

  ruby_version_is '3.0' do
    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

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