mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #698 from masuidrive/improve_mrbgems_test
improve mrbgems
This commit is contained in:
@@ -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'
|
||||
|
||||
##############################
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
+12
-18
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user