1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/core/warning/warn_spec.rb
Jeremy Evans 346301e232 Add rb_category_warn{,ing} for warning messages with categories
This adds the following C-API functions that can be used to emit
warnings with categories included:

```c
void rb_category_warn(const char *, const char*, ...)
void rb_category_warning(const char*, const char*, ...)
```

Internally in error.c, there is an rb_warn_category function
that will call Warning.warn with the string and the category
keyword if it doesn't have an arity of 1, and will call
Warning.warn with just the string if it has an arity of 1.
This refactors the rb_warn_deprecated{,_to_remove} functions
to use rb_warn_category.

This makes Kernel#warn accept a category keyword and pass it
to Warning.warn, so that Ruby methods can more easily emit
warnings with categories.  rb_warn_category makes sure that
the passed category is a already defined category symbol
before calling Warning.warn.

The only currently defined warning category is :deprecated,
since that is what is already used.  More categories can be
added in later commits.
2020-09-28 08:38:06 -07:00

91 lines
2.2 KiB
Ruby

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
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