1 | MRuby::Gem::Specification.new('mruby-test') do |spec|
|
---|
2 | spec.license = 'MIT'
|
---|
3 | spec.author = 'mruby developers'
|
---|
4 | spec.summary = 'mruby test'
|
---|
5 |
|
---|
6 | build.bins << 'mrbtest'
|
---|
7 | spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
|
---|
8 |
|
---|
9 | spec.test_rbfiles = Dir.glob("#{MRUBY_ROOT}/test/t/*.rb")
|
---|
10 |
|
---|
11 | clib = "#{build_dir}/mrbtest.c"
|
---|
12 | mlib = clib.ext(exts.object)
|
---|
13 | exec = exefile("#{build.build_dir}/bin/mrbtest")
|
---|
14 |
|
---|
15 | libmruby = libfile("#{build.build_dir}/lib/libmruby")
|
---|
16 | libmruby_core = libfile("#{build.build_dir}/lib/libmruby_core")
|
---|
17 |
|
---|
18 | mrbtest_lib = libfile("#{build_dir}/mrbtest")
|
---|
19 | mrbtest_objs = []
|
---|
20 |
|
---|
21 | driver_obj = objfile("#{build_dir}/driver")
|
---|
22 | driver = "#{spec.dir}/driver.c"
|
---|
23 |
|
---|
24 | assert_c = "#{build_dir}/assert.c"
|
---|
25 | assert_rb = "#{MRUBY_ROOT}/test/assert.rb"
|
---|
26 | assert_lib = assert_c.ext(exts.object)
|
---|
27 | mrbtest_objs << assert_lib
|
---|
28 |
|
---|
29 | file assert_lib => assert_c
|
---|
30 | file assert_c => assert_rb do |t|
|
---|
31 | open(t.name, 'w') do |f|
|
---|
32 | mrbc.run f, assert_rb, 'mrbtest_assert_irep'
|
---|
33 | end
|
---|
34 | end
|
---|
35 |
|
---|
36 | gem_table = build.gems.generate_gem_table build
|
---|
37 |
|
---|
38 | build.gems.each do |g|
|
---|
39 | test_rbobj = g.test_rbireps.ext(exts.object)
|
---|
40 | g.test_objs << test_rbobj
|
---|
41 | dep_list = build.gems.tsort_dependencies(g.test_dependencies, gem_table).select(&:generate_functions)
|
---|
42 |
|
---|
43 | file test_rbobj => g.test_rbireps
|
---|
44 | file g.test_rbireps => [g.test_rbfiles].flatten do |t|
|
---|
45 | FileUtils.mkdir_p File.dirname(t.name)
|
---|
46 | open(t.name, 'w') do |f|
|
---|
47 | g.print_gem_test_header(f)
|
---|
48 | test_preload = g.test_preload and [g.dir, MRUBY_ROOT].map {|dir|
|
---|
49 | File.expand_path(g.test_preload, dir)
|
---|
50 | }.find {|file| File.exist?(file) }
|
---|
51 |
|
---|
52 | f.puts %Q[/*]
|
---|
53 | f.puts %Q[ * This file contains a test code for #{g.name} gem.]
|
---|
54 | f.puts %Q[ *]
|
---|
55 | f.puts %Q[ * IMPORTANT:]
|
---|
56 | f.puts %Q[ * This file was generated!]
|
---|
57 | f.puts %Q[ * All manual changes will get lost.]
|
---|
58 | f.puts %Q[ */]
|
---|
59 | if test_preload.nil?
|
---|
60 | f.puts %Q[extern const uint8_t mrbtest_assert_irep[];]
|
---|
61 | else
|
---|
62 | g.build.mrbc.run f, test_preload, "gem_test_irep_#{g.funcname}_preload"
|
---|
63 | end
|
---|
64 | g.test_rbfiles.flatten.each_with_index do |rbfile, i|
|
---|
65 | g.build.mrbc.run f, rbfile, "gem_test_irep_#{g.funcname}_#{i}"
|
---|
66 | end
|
---|
67 | f.puts %Q[void mrb_#{g.funcname}_gem_test(mrb_state *mrb);] unless g.test_objs.empty?
|
---|
68 | dep_list.each do |d|
|
---|
69 | f.puts %Q[void GENERATED_TMP_mrb_#{d.funcname}_gem_init(mrb_state *mrb);]
|
---|
70 | f.puts %Q[void GENERATED_TMP_mrb_#{d.funcname}_gem_final(mrb_state *mrb);]
|
---|
71 | end
|
---|
72 | f.puts %Q[void mrb_init_test_driver(mrb_state *mrb, mrb_bool verbose);]
|
---|
73 | f.puts %Q[void mrb_t_pass_result(mrb_state *dst, mrb_state *src);]
|
---|
74 | f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb) {]
|
---|
75 | unless g.test_rbfiles.empty?
|
---|
76 | f.puts %Q[ mrb_state *mrb2;]
|
---|
77 | unless g.test_args.empty?
|
---|
78 | f.puts %Q[ mrb_value test_args_hash;]
|
---|
79 | end
|
---|
80 | f.puts %Q[ int ai;]
|
---|
81 | g.test_rbfiles.count.times do |i|
|
---|
82 | f.puts %Q[ ai = mrb_gc_arena_save(mrb);]
|
---|
83 | f.puts %Q[ mrb2 = mrb_open_core(mrb_default_allocf, NULL);]
|
---|
84 | f.puts %Q[ if (mrb2 == NULL) {]
|
---|
85 | f.puts %Q[ fprintf(stderr, "Invalid mrb_state, exiting \%s", __FUNCTION__);]
|
---|
86 | f.puts %Q[ exit(EXIT_FAILURE);]
|
---|
87 | f.puts %Q[ }]
|
---|
88 | dep_list.each do |d|
|
---|
89 | f.puts %Q[ GENERATED_TMP_mrb_#{d.funcname}_gem_init(mrb2);]
|
---|
90 | f.puts %Q[ mrb_state_atexit(mrb2, GENERATED_TMP_mrb_#{d.funcname}_gem_final);]
|
---|
91 | end
|
---|
92 | f.puts %Q[ mrb_init_test_driver(mrb2, mrb_test(mrb_gv_get(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"))));]
|
---|
93 | if test_preload.nil?
|
---|
94 | f.puts %Q[ mrb_load_irep(mrb2, mrbtest_assert_irep);]
|
---|
95 | else
|
---|
96 | f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_preload);]
|
---|
97 | end
|
---|
98 | f.puts %Q[ if (mrb2->exc) {]
|
---|
99 | f.puts %Q[ mrb_print_error(mrb2);]
|
---|
100 | f.puts %Q[ exit(EXIT_FAILURE);]
|
---|
101 | f.puts %Q[ }]
|
---|
102 | f.puts %Q[ mrb_const_set(mrb2, mrb_obj_value(mrb2->object_class), mrb_intern_lit(mrb2, "GEMNAME"), mrb_str_new(mrb2, "#{g.name}", #{g.name.length}));]
|
---|
103 |
|
---|
104 | unless g.test_args.empty?
|
---|
105 | f.puts %Q[ test_args_hash = mrb_hash_new_capa(mrb, #{g.test_args.length}); ]
|
---|
106 | g.test_args.each do |arg_name, arg_value|
|
---|
107 | escaped_arg_name = arg_name.gsub('\\', '\\\\\\\\').gsub('"', '\"')
|
---|
108 | escaped_arg_value = arg_value.gsub('\\', '\\\\\\\\').gsub('"', '\"')
|
---|
109 | f.puts %Q[ mrb_hash_set(mrb2, test_args_hash, mrb_str_new(mrb2, "#{escaped_arg_name.to_s}", #{escaped_arg_name.to_s.length}), mrb_str_new(mrb2, "#{escaped_arg_value.to_s}", #{escaped_arg_value.to_s.length})); ]
|
---|
110 | end
|
---|
111 | f.puts %Q[ mrb_const_set(mrb2, mrb_obj_value(mrb2->object_class), mrb_intern_lit(mrb2, "TEST_ARGS"), test_args_hash); ]
|
---|
112 | end
|
---|
113 |
|
---|
114 | f.puts %Q[ mrb_#{g.funcname}_gem_test(mrb2);] if g.custom_test_init?
|
---|
115 |
|
---|
116 | f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_#{i});]
|
---|
117 | f.puts %Q[ ]
|
---|
118 |
|
---|
119 | f.puts %Q[ mrb_t_pass_result(mrb, mrb2);]
|
---|
120 | f.puts %Q[ mrb_close(mrb2);]
|
---|
121 | f.puts %Q[ mrb_gc_arena_restore(mrb, ai);]
|
---|
122 | end
|
---|
123 | end
|
---|
124 | f.puts %Q[}]
|
---|
125 | end
|
---|
126 | end
|
---|
127 | end
|
---|
128 |
|
---|
129 | build.gems.each do |v|
|
---|
130 | mrbtest_objs.concat v.test_objs
|
---|
131 | end
|
---|
132 |
|
---|
133 | file mrbtest_lib => mrbtest_objs do |t|
|
---|
134 | build.archiver.run t.name, t.prerequisites
|
---|
135 | end
|
---|
136 |
|
---|
137 | unless build.build_mrbtest_lib_only?
|
---|
138 | file exec => [driver_obj, mlib, mrbtest_lib, libmruby_core, libmruby] do |t|
|
---|
139 | gem_flags = build.gems.map { |g| g.linker.flags }
|
---|
140 | gem_flags_before_libraries = build.gems.map { |g| g.linker.flags_before_libraries }
|
---|
141 | gem_flags_after_libraries = build.gems.map { |g| g.linker.flags_after_libraries }
|
---|
142 | gem_libraries = build.gems.map { |g| g.linker.libraries }
|
---|
143 | gem_library_paths = build.gems.map { |g| g.linker.library_paths }
|
---|
144 | build.linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
|
---|
145 | end
|
---|
146 | end
|
---|
147 |
|
---|
148 | init = "#{spec.dir}/init_mrbtest.c"
|
---|
149 |
|
---|
150 | # store the last gem selection and make the re-build
|
---|
151 | # of the test gem depending on a change to the gem
|
---|
152 | # selection
|
---|
153 | active_gems = "#{build_dir}/active_gems.lst"
|
---|
154 | FileUtils.mkdir_p File.dirname(active_gems)
|
---|
155 | open(active_gems, 'w+') do |f|
|
---|
156 | build.gems.each do |g|
|
---|
157 | f.puts g.name
|
---|
158 | end
|
---|
159 | end
|
---|
160 | file clib => active_gems
|
---|
161 |
|
---|
162 | file mlib => clib
|
---|
163 | file clib => init do |t|
|
---|
164 | _pp "GEN", "*.rb", "#{clib.relative_path}"
|
---|
165 | FileUtils.mkdir_p File.dirname(clib)
|
---|
166 | open(clib, 'w') do |f|
|
---|
167 | f.puts %Q[/*]
|
---|
168 | f.puts %Q[ * This file contains a list of all]
|
---|
169 | f.puts %Q[ * test functions.]
|
---|
170 | f.puts %Q[ *]
|
---|
171 | f.puts %Q[ * IMPORTANT:]
|
---|
172 | f.puts %Q[ * This file was generated!]
|
---|
173 | f.puts %Q[ * All manual changes will get lost.]
|
---|
174 | f.puts %Q[ */]
|
---|
175 | f.puts %Q[]
|
---|
176 | f.puts IO.read(init)
|
---|
177 | build.gems.each do |g|
|
---|
178 | f.puts %Q[void GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb_state *mrb);]
|
---|
179 | end
|
---|
180 | f.puts %Q[void mrbgemtest_init(mrb_state* mrb) {]
|
---|
181 | build.gems.each do |g|
|
---|
182 | f.puts %Q[ GENERATED_TMP_mrb_#{g.funcname}_gem_test(mrb);]
|
---|
183 | end
|
---|
184 | f.puts %Q[}]
|
---|
185 | end
|
---|
186 | end
|
---|
187 | end
|
---|