diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-01-06 14:07:06 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-01-06 14:07:06 -0800 |
| commit | 4258d7735beec9252bf6cb282fb704cb2cbe9ce9 (patch) | |
| tree | 1049b9591c820e4f4edcc3e1872d7798fefe4f4a | |
| parent | 101b617d24b3c25d0b5b36ab13ebf5336d167f50 (diff) | |
| parent | 280bad605e764d1caf59a3ee21b640e077b63d2f (diff) | |
| download | mruby-4258d7735beec9252bf6cb282fb704cb2cbe9ce9.tar.gz mruby-4258d7735beec9252bf6cb282fb704cb2cbe9ce9.zip | |
Merge pull request #698 from masuidrive/improve_mrbgems_test
improve mrbgems
| -rw-r--r-- | Rakefile | 2 | ||||
| -rw-r--r-- | tasks/mrbgems_test.rake | 73 | ||||
| -rw-r--r-- | tasks/mruby_gem_spec.rake | 41 | ||||
| -rw-r--r-- | test/assert.rb | 30 |
4 files changed, 95 insertions, 51 deletions
@@ -19,6 +19,8 @@ load 'tasks/mrbgems.rake' load 'tasks/libmruby.rake' load 'tools/mruby/mruby.rake' load 'tools/mirb/mirb.rake' + +load 'tasks/mrbgems_test.rake' load 'test/mrbtest.rake' ############################## diff --git a/tasks/mrbgems_test.rake b/tasks/mrbgems_test.rake new file mode 100644 index 000000000..f247718a0 --- /dev/null +++ b/tasks/mrbgems_test.rake @@ -0,0 +1,73 @@ +dir = File.dirname(__FILE__).sub(%r|^\./|, '') + +MRuby.each_target do + gems.each do |g| + test_rbc = "#{g.build_dir}/gem_test.c" + test_rbobj = test_rbc.ext('o') + + Rake::FileTask.define_task g.testlib => g.test_objs + [test_rbobj] do |t| + g.build.archive t.name, 'rs', t.prerequisites + end + + Rake::FileTask.define_task test_rbobj => test_rbc + Rake::FileTask.define_task test_rbc => g.test_rbfiles + [g.build.mrbcfile, "#{build_dir}/lib/libmruby.a"] do |t| + open(t.name, 'w') do |f| + f.puts g.gem_init_header + g.build.compile_mruby f, g.test_preload, "gem_test_irep_#{g.funcname}_preload" + g.test_rbfiles.each_with_index do |rbfile, i| + g.build.compile_mruby f, rbfile, "gem_test_irep_#{g.funcname}_#{i}" + end + f.puts %Q[void mrb_#{g.funcname}_gem_test(mrb_state *mrb);] unless g.test_objs.empty? + f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb) {] + f.puts %Q[ mrb_state *mrb2;] + f.puts %Q[ mrb_value val1, val2, ary1, ary2;] + f.puts %Q[ int ai;] + unless g.test_rbfiles.empty? + g.test_rbfiles.count.times do |i| + f.puts %Q[ ai = mrb_gc_arena_save(mrb);] + f.puts %Q[ mrb2 = mrb_open();] + f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_preload);] + f.puts %Q[ if (mrb2->exc) {] + f.puts %Q[ mrb_p(mrb2, mrb_obj_value(mrb2->exc));] + f.puts %Q[ exit(0);] + f.puts %Q[ }] + f.puts %Q[ mrb_const_set(mrb2, mrb_obj_value(mrb2->object_class), mrb_intern(mrb2, "GEMNAME"), mrb_str_new(mrb2, "#{g.name}", #{g.name.length}));] + + f.puts %Q[ mrb_#{g.funcname}_gem_test(mrb2);] unless g.test_objs.empty? + + f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_#{i});] + f.puts %Q[ if (mrb2->exc) {] + f.puts %Q[ mrb_p(mrb2, mrb_obj_value(mrb2->exc));] + f.puts %Q[ exit(0);] + f.puts %Q[ }] + f.puts %Q[ ] + + %w(ok_test ko_test kill_test).each do |vname| + f.puts %Q[ val1 = mrb_gv_get(mrb2, mrb_intern(mrb, "$#{vname}"));] + f.puts %Q[ if(mrb_fixnum_p(val1)) {] + f.puts %Q[ val2 = mrb_gv_get(mrb, mrb_intern(mrb, "$#{vname}"));] + f.puts %Q[ mrb_gv_set(mrb, mrb_intern(mrb, "$#{vname}"), mrb_fixnum_value(mrb_fixnum(val1) + mrb_fixnum(val2)));] + f.puts %Q[ }\n] + end + + f.puts %Q[ ary2 = mrb_gv_get(mrb2, mrb_intern(mrb2, "$asserts"));] + f.puts %Q[ if(mrb_test(ary2)) {] + f.puts %Q[ ary1 = mrb_gv_get(mrb, mrb_intern(mrb, "$asserts"));] + f.puts %Q[ val2 = mrb_ary_shift(mrb2, ary2);] + f.puts %Q[ ] + f.puts %Q[ while(mrb_test(val2)) {] + f.puts %Q[ char *str = mrb_string_value_cstr(mrb2, &val2);] + f.puts %Q[ mrb_ary_push(mrb, ary1, mrb_str_new(mrb, str, strlen(str)));] + f.puts %Q[ val2 = mrb_ary_shift(mrb2, ary2);] + f.puts %Q[ }] + f.puts %Q[ }] + f.puts %Q[ mrb_close(mrb2);] + f.puts %Q[ mrb_gc_arena_restore(mrb, ai);] + end + end + f.puts %Q[}] + end + end + + end +end diff --git a/tasks/mruby_gem_spec.rake b/tasks/mruby_gem_spec.rake index d9078cd29..c2479412e 100644 --- a/tasks/mruby_gem_spec.rake +++ b/tasks/mruby_gem_spec.rake @@ -66,46 +66,15 @@ module MRuby end def build_dir - return @build_dir if @build_dir - @build_dir = "#{build.build_dir}/mrbgems/#{name}" + @build_dir ||= "#{build.build_dir}/mrbgems/#{name}" FileUtils.mkdir_p @build_dir @build_dir end def add_tasks - test_rbc = "#{build_dir}/gem_test.c" - test_rbobj = test_rbc.ext('o') - - Rake::FileTask.define_task testlib => test_objs + [test_rbobj] do |t| - build.archive t.name, 'rs', t.prerequisites - end - - Rake::FileTask.define_task test_rbobj => test_rbc - Rake::FileTask.define_task test_rbc => [build.mrbcfile] + test_rbfiles do |t| - open(t.name, 'w') do |f| - f.puts gem_init_header - build.compile_mruby f, test_rbfiles, "gem_test_irep_#{funcname}" unless test_rbfiles.empty? - end - - open(t.name, 'a') do |f| - f.puts "void mrb_#{funcname}_gem_test(mrb_state *mrb);" unless test_objs.empty? - f.puts "void GENERATED_TMP_mrb_#{funcname}_gem_test(mrb_state *mrb) {" - f.puts " mrb_#{funcname}_gem_test(mrb);" unless test_objs.empty? - f.puts <<__EOF__ unless test_rbfiles.empty? - mrb_load_irep(mrb, gem_test_irep_#{funcname}); - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - exit(0); - } - -__EOF__ - f.puts "}" - end - end - Rake::FileTask.define_task "#{build_dir}/gem_init.o" => "#{build_dir}/gem_init.c" Rake::FileTask.define_task "#{build_dir}/gem_init.c" => [build.mrbcfile] + rbfiles do |t| - generate_gem_init(t.name) + generate_gem_init("#{build_dir}/gem_init.c") end end @@ -149,6 +118,7 @@ __EOF__ build.compile_mruby f, rbfiles, "gem_mrblib_irep_#{funcname}" unless rbfiles.empty? f.puts "void mrb_#{funcname}_gem_init(mrb_state *mrb);" f.puts "void GENERATED_TMP_mrb_#{funcname}_gem_init(mrb_state *mrb) {" + f.puts " int ai = mrb_gc_arena_save(mrb);" f.puts " mrb_#{funcname}_gem_init(mrb);" if objs != ["#{build_dir}/gem_init.o"] f.puts <<__EOF__ unless rbfiles.empty? mrb_load_irep(mrb, gem_mrblib_irep_#{funcname}); @@ -158,6 +128,8 @@ __EOF__ } __EOF__ + f.puts " mrb_gc_arena_restore(mrb, ai);" + f.puts "}" end end # generate_gem_init @@ -177,6 +149,9 @@ __EOF__ #include "mruby/dump.h" #include "mruby/string.h" #include "mruby/proc.h" +#include "mruby/variable.h" +#include "mruby/array.h" +#include "mruby/string.h" __EOF__ end # gem_init_header diff --git a/test/assert.rb b/test/assert.rb index 89e820a00..4fe95de9d 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -5,14 +5,13 @@ $asserts = [] $test_start = Time.now if Object.const_defined?(:Time) ## -# Print the assertion in a readable way -def print_assertion_string(str, iso) - print(str) - if(iso != '') - print(' [') - print(iso) - print(']') - end +# Create the assertion in a readable way +def assertion_string(err, str, iso=nil, e=nil) + msg = "#{err}#{str}" + msg += " [#{iso}]" if iso && iso != '' + msg += " => #{e.message}" if e + msg += " (mrbgems: #{GEMNAME})" if Object.const_defined?(:GEMNAME) + msg end ## @@ -26,7 +25,7 @@ end def assert(str = 'Assertion failed', iso = '') begin if(!yield) - $asserts.push(['Fail: ', str, iso]) + $asserts.push(assertion_string('Fail: ', str, iso)) $ko_test += 1 print('F') else @@ -34,7 +33,7 @@ def assert(str = 'Assertion failed', iso = '') print('.') end rescue Exception => e - $asserts.push(['Error: ', str, iso, e]) + $asserts.push(assertion_string('Error: ', str, iso, e)) $kill_test += 1 print('X') end @@ -45,14 +44,9 @@ end # which were reported broken. def report() print "\n" - $asserts.each do |err, str, iso, e| - print(err); - print_assertion_string(str, iso) - if e - print(" => ") - print(e.message) - end - print("\n") + + $asserts.each do |msg| + puts msg end $total_test = $ok_test.+($ko_test) |
