From 57bd8d49ec88c7f6a0432a09168af9420ae50c7e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 01:50:10 +0800 Subject: Add first test case for Class#new and prepare further feature tests for it --- test/t/class.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'test/t/class.rb') diff --git a/test/t/class.rb b/test/t/class.rb index 92f3df51d..3c398e923 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,6 +5,36 @@ assert('Class', '15.2.3') do Class.class == Class end +assert('Class#new', '15.2.3.3.3') do + # at the moment no exception on singleton class + #e1 = nil + #begin + # class1 = e1.singleton_class.new + #rescue => e1 + # e2 = e1 + #end + + class TestClass + def initialize args, &block + @result = if not args.nil? and block.nil? + # only arguments + :only_args + elsif not args.nil? and not block.nil? + # args and block is given + :args_and_block + else + # this should never happen + :broken + end + end + + def result; @result; end + end + + TestClass.new(:arg).result == :only_args + # with block doesn't work yet +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From df80b7835a5d99e2f5a25446abb53ea3e68e7709 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 08:20:48 +0900 Subject: Add Class#superclass; a patch made by @bovi; close #234 --- src/class.c | 10 ++++++++++ test/t/class.rb | 5 +++++ 2 files changed, 15 insertions(+) (limited to 'test/t/class.rb') diff --git a/src/class.c b/src/class.c index 544f36527..748996e62 100644 --- a/src/class.c +++ b/src/class.c @@ -819,6 +819,15 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) return mrb_obj_value(new_class); } +mrb_value +mrb_class_superclass(mrb_state *mrb, mrb_value klass) +{ + struct RClass *c, *s; + c = mrb_class_ptr(klass); + s = c->super; + return mrb_obj_value(s); +} + static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv) { @@ -1240,6 +1249,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE()); mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */ mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY()); + mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); diff --git a/test/t/class.rb b/test/t/class.rb index 92f3df51d..cb056feff 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,6 +5,11 @@ assert('Class', '15.2.3') do Class.class == Class end +assert('Class#superclass', '15.2.3.3.4') do + class SubClass < String; end + SubClass.superclass == String +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From 5612d195ec39612b7216ff3f28d05ed089452767 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:29:40 +0800 Subject: Improve Class#superclass to ISO --- src/class.c | 12 +++++++++--- test/t/class.rb | 10 +++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'test/t/class.rb') diff --git a/src/class.c b/src/class.c index c689552f5..594ed08bc 100644 --- a/src/class.c +++ b/src/class.c @@ -822,10 +822,16 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) mrb_value mrb_class_superclass(mrb_state *mrb, mrb_value klass) { - struct RClass *c, *s; + struct RClass *c; + mrb_value superclass; + c = mrb_class_ptr(klass); - s = mrb_class_real(c->super); - return mrb_obj_value(s); + if (c->super) + superclass = mrb_obj_value(mrb_class_real(c->super)); + else + superclass = mrb_nil_value(); + + return superclass; } static mrb_value diff --git a/test/t/class.rb b/test/t/class.rb index d252cf590..1b809a832 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,9 +5,8 @@ assert('Class', '15.2.3') do Class.class == Class end -assert('Class#superclass', '15.2.3.3.4') do - class SubClass < String; end - SubClass.superclass == String +assert('Class superclass', '15.2.3.2') do + Class.superclass == Module end assert('Class#new', '15.2.3.3.3') do @@ -40,6 +39,11 @@ assert('Class#new', '15.2.3.3.3') do # with block doesn't work yet end +assert('Class#superclass', '15.2.3.3.4') do + class SubClass < String; end + SubClass.superclass == String +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From b71063b239cbbdbdd6779d7b590c0cad59e0c3ae Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 29 Jul 2012 14:02:07 +0900 Subject: Modify test for Class. * Rename some classes in test/t/class.rb to avoid name conflict. * Add tests for mismatch fo superclass. --- test/t/class.rb | 76 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 15 deletions(-) (limited to 'test/t/class.rb') diff --git a/test/t/class.rb b/test/t/class.rb index 1b809a832..d6c4715dd 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -47,36 +47,82 @@ end # Not ISO specified assert('Class 1') do - class C; end - C.class == Class + class C1; end + C1.class == Class end assert('Class 2') do - class C; end - C.new.class == C + class C2; end + C2.new.class == C2 end assert('Class 3') do - class C; end - C.new.class.class == Class + class C3; end + C3.new.class.class == Class end assert('Class 4') do - class A; end - class C < A; end - C.class == Class + class C4_A; end + class C4 < C4_A; end + C4.class == Class end assert('Class 5') do - class A; end - class C < A; end - C.new.class == C + class C5_A; end + class C5 < C5_A; end + C5.new.class == C5 end assert('Class 6') do - class A; end - class C < A; end - C.new.class.class == Class + class C6_A; end + class C6 < C6_A; end + C6.new.class.class == Class +end + +assert('Class 7') do + class C7_A; end + class C7_B; end + + class C7 < C7_A; end + + error = false + begin + # Different superclass. + class C7 < C7_B; end + rescue TypeError + error = true + end + + error +end + +assert('Class 8') do + class C8_A; end + + class C8; end # superclass is Object + + error = false + begin + # Different superclass. + class C8 < C8_A; end + rescue TypeError + error = true + end + + error +end + +assert('Class 9') do + Class9Const = "a" + + error = false + begin + class Class9Const; end + rescue TypeError + error = true + end + + error end assert('Class Module 1') do -- cgit v1.2.3