summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--struct.c2
-rw-r--r--test/ruby/test_struct.rb119
3 files changed, 81 insertions, 44 deletions
diff --git a/ChangeLog b/ChangeLog
index 9f10ea1950..e023ac752d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Oct 28 00:52:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (new_struct): fix warning message, class name and encoding.
+
Sun Oct 27 20:53:08 2013 Tanaka Akira <akr@fsij.org>
* ext/readline/readline.c: Include ruby/thread.h for
diff --git a/struct.c b/struct.c
index 28d32c38a2..bae826bf80 100644
--- a/struct.c
+++ b/struct.c
@@ -188,7 +188,7 @@ new_struct(VALUE name, VALUE super)
}
id = rb_to_id(name);
if (rb_const_defined_at(super, id)) {
- rb_warn("redefining constant Struct::%s", StringValuePtr(name));
+ rb_warn("redefining constant %"PRIsVALUE"::%"PRIsVALUE, super, name);
rb_mod_remove_const(super, ID2SYM(id));
}
return rb_define_class_id_under(super, id, super);
diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb
index 1bcc485410..0c4eafc14a 100644
--- a/test/ruby/test_struct.rb
+++ b/test/ruby/test_struct.rb
@@ -3,10 +3,10 @@ require 'test/unit'
require 'timeout'
require_relative 'envutil'
-class TestStruct < Test::Unit::TestCase
+module TestStruct
def test_struct
- struct_test = Struct.new("Test", :foo, :bar)
- assert_equal(Struct::Test, struct_test)
+ struct_test = @Struct.new("Test", :foo, :bar)
+ assert_equal(@Struct::Test, struct_test)
test = struct_test.new(1, 2)
assert_equal(1, test.foo)
@@ -29,7 +29,7 @@ class TestStruct < Test::Unit::TestCase
def test_morethan10members
list = %w( a b c d e f g h i j k l m n o p )
until list.empty?
- c = Struct.new(* list.map {|ch| ch.intern }).new
+ c = @Struct.new(* list.map {|ch| ch.intern }).new
list.each do |ch|
c.__send__(ch)
end
@@ -41,7 +41,7 @@ class TestStruct < Test::Unit::TestCase
names = [:a, :b, :c, :d]
1.upto(4) {|n|
fields = names[0, n]
- klass = Struct.new(*fields)
+ klass = @Struct.new(*fields)
o = klass.new(*(0...n).to_a)
fields.each_with_index {|name, i|
assert_equal(i, o[name])
@@ -54,28 +54,28 @@ class TestStruct < Test::Unit::TestCase
end
def test_inherit
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
klass2 = Class.new(klass)
o = klass2.new(1)
assert_equal(1, o.a)
end
def test_members
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal([:a], klass.members)
assert_equal([:a], o.members)
end
def test_ref
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal(1, o[:a])
assert_raise(NameError) { o[:b] }
end
def test_set
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
o[:a] = 2
assert_equal(2, o[:a])
@@ -83,28 +83,28 @@ class TestStruct < Test::Unit::TestCase
end
def test_struct_new
- assert_raise(NameError) { Struct.new("foo") }
- assert_nothing_raised { Struct.new("Foo") }
- Struct.instance_eval { remove_const(:Foo) }
- assert_nothing_raised { Struct.new(:a) { } }
- assert_raise(RuntimeError) { Struct.new(:a) { raise } }
+ assert_raise(NameError) { @Struct.new("foo") }
+ assert_nothing_raised { @Struct.new("Foo") }
+ @Struct.instance_eval { remove_const(:Foo) }
+ assert_nothing_raised { @Struct.new(:a) { } }
+ assert_raise(RuntimeError) { @Struct.new(:a) { raise } }
assert_equal([:utime, :stime, :cutime, :cstime], Process.times.members)
end
def test_initialize
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
assert_raise(ArgumentError) { klass.new(1, 2) }
end
def test_each
- klass = Struct.new(:a, :b)
+ klass = @Struct.new(:a, :b)
o = klass.new(1, 2)
assert_equal([1, 2], o.each.to_a)
end
def test_each_pair
- klass = Struct.new(:a, :b)
+ klass = @Struct.new(:a, :b)
o = klass.new(1, 2)
assert_equal([[:a, 1], [:b, 2]], o.each_pair.to_a)
bug7382 = '[ruby-dev:46533]'
@@ -114,22 +114,22 @@ class TestStruct < Test::Unit::TestCase
end
def test_inspect
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal("#<struct a=1>", o.inspect)
o.a = o
assert_match(/^#<struct a=#<struct #<.*?>:...>>$/, o.inspect)
- Struct.new("Foo", :a)
- o = Struct::Foo.new(1)
- assert_equal("#<struct Struct::Foo a=1>", o.inspect)
- Struct.instance_eval { remove_const(:Foo) }
+ @Struct.new("Foo", :a)
+ o = @Struct::Foo.new(1)
+ assert_equal("#<struct #@Struct::Foo a=1>", o.inspect)
+ @Struct.instance_eval { remove_const(:Foo) }
- klass = Struct.new(:a, :b)
+ klass = @Struct.new(:a, :b)
o = klass.new(1, 2)
assert_equal("#<struct a=1, b=2>", o.inspect)
- klass = Struct.new(:@a)
+ klass = @Struct.new(:@a)
o = klass.new(1)
assert_equal(1, o.__send__(:@a))
assert_equal("#<struct :@a=1>", o.inspect)
@@ -147,13 +147,13 @@ class TestStruct < Test::Unit::TestCase
end
def test_init_copy
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal(o, o.dup)
end
def test_aref
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal(1, o[0])
assert_raise(IndexError) { o[-2] }
@@ -161,7 +161,7 @@ class TestStruct < Test::Unit::TestCase
end
def test_aset
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
o[0] = 2
assert_equal(2, o[:a])
@@ -170,22 +170,22 @@ class TestStruct < Test::Unit::TestCase
end
def test_values_at
- klass = Struct.new(:a, :b, :c, :d, :e, :f)
+ klass = @Struct.new(:a, :b, :c, :d, :e, :f)
o = klass.new(1, 2, 3, 4, 5, 6)
assert_equal([2, 4, 6], o.values_at(1, 3, 5))
assert_equal([2, 3, 4, 3, 4, 5], o.values_at(1..3, 2...5))
end
def test_select
- klass = Struct.new(:a, :b, :c, :d, :e, :f)
+ klass = @Struct.new(:a, :b, :c, :d, :e, :f)
o = klass.new(1, 2, 3, 4, 5, 6)
assert_equal([1, 3, 5], o.select {|v| v % 2 != 0 })
assert_raise(ArgumentError) { o.select(1) }
end
def test_equal
- klass1 = Struct.new(:a)
- klass2 = Struct.new(:a, :b)
+ klass1 = @Struct.new(:a)
+ klass2 = @Struct.new(:a, :b)
o1 = klass1.new(1)
o2 = klass1.new(1)
o3 = klass2.new(1)
@@ -194,14 +194,14 @@ class TestStruct < Test::Unit::TestCase
end
def test_hash
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert(o.hash.is_a?(Fixnum))
end
def test_eql
- klass1 = Struct.new(:a)
- klass2 = Struct.new(:a, :b)
+ klass1 = @Struct.new(:a)
+ klass2 = @Struct.new(:a, :b)
o1 = klass1.new(1)
o2 = klass1.new(1)
o3 = klass2.new(1)
@@ -210,33 +210,47 @@ class TestStruct < Test::Unit::TestCase
end
def test_size
- klass = Struct.new(:a)
+ klass = @Struct.new(:a)
o = klass.new(1)
assert_equal(1, o.size)
end
def test_error
assert_raise(TypeError){
- Struct.new(0)
+ @Struct.new(0)
}
end
+ def test_redefinition_warning
+ @Struct.new("RedefinitionWarning")
+ e = EnvUtil.verbose_warning do
+ @Struct.new("RedefinitionWarning")
+ end
+ assert_match(/redefining constant #@Struct::RedefinitionWarning/, e)
+ end
+
def test_nonascii
- struct_test = Struct.new("R\u{e9}sum\u{e9}", :"r\u{e9}sum\u{e9}")
- assert_equal(Struct.const_get("R\u{e9}sum\u{e9}"), struct_test, '[ruby-core:24849]')
+ struct_test = @Struct.new("R\u{e9}sum\u{e9}", :"r\u{e9}sum\u{e9}")
+ assert_equal(@Struct.const_get("R\u{e9}sum\u{e9}"), struct_test, '[ruby-core:24849]')
a = struct_test.new(42)
- assert_equal("#<struct Struct::R\u{e9}sum\u{e9} r\u{e9}sum\u{e9}=42>", a.inspect, '[ruby-core:24849]')
+ assert_equal("#<struct #@Struct::R\u{e9}sum\u{e9} r\u{e9}sum\u{e9}=42>", a.inspect, '[ruby-core:24849]')
+ e = EnvUtil.verbose_warning do
+ @Struct.new("R\u{e9}sum\u{e9}", :"r\u{e9}sum\u{e9}")
+ end
+ assert_nothing_raised(Encoding::CompatibilityError) do
+ assert_match(/redefining constant #@Struct::R\u{e9}sum\u{e9}/, e)
+ end
end
def test_junk
- struct_test = Struct.new("Foo", "a\000")
+ struct_test = @Struct.new("Foo", "a\000")
o = struct_test.new(1)
assert_equal(1, o.send("a\000"))
- Struct.instance_eval { remove_const(:Foo) }
+ @Struct.instance_eval { remove_const(:Foo) }
end
def test_comparison_when_recursive
- klass1 = Struct.new(:a, :b, :c)
+ klass1 = @Struct.new(:a, :b, :c)
x = klass1.new(1, 2, nil); x.c = x
y = klass1.new(1, 2, nil); y.c = y
@@ -265,8 +279,27 @@ class TestStruct < Test::Unit::TestCase
end
def test_to_h
- klass = Struct.new(:a, :b, :c, :d, :e, :f)
+ klass = @Struct.new(:a, :b, :c, :d, :e, :f)
o = klass.new(1, 2, 3, 4, 5, 6)
assert_equal({a:1, b:2, c:3, d:4, e:5, f:6}, o.to_h)
end
+
+ class TopStruct < Test::Unit::TestCase
+ include TestStruct
+
+ def initialize(*)
+ super
+ @Struct = Struct
+ end
+ end
+
+ class SubStruct < Test::Unit::TestCase
+ include TestStruct
+ SubStruct = Class.new(Struct)
+
+ def initialize(*)
+ super
+ @Struct = SubStruct
+ end
+ end
end