source: EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-test/driver.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 4.2 KB
Line 
1/*
2** mrbtest - Test for Embeddable Ruby
3**
4** This program runs Ruby test programs in test/t directory
5** against the current mruby implementation.
6*/
7
8
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13#include <mruby.h>
14#include <mruby/proc.h>
15#include <mruby/data.h>
16#include <mruby/compile.h>
17#include <mruby/string.h>
18#include <mruby/variable.h>
19#include <mruby/array.h>
20
21void
22mrb_init_mrbtest(mrb_state *);
23
24/* Print a short remark for the user */
25static void
26print_hint(void)
27{
28 printf("mrbtest - Embeddable Ruby Test\n\n");
29}
30
31static int
32check_error(mrb_state *mrb)
33{
34 /* Error check */
35 /* $ko_test and $kill_test should be 0 */
36 mrb_value ko_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$ko_test"));
37 mrb_value kill_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$kill_test"));
38
39 return mrb_fixnum_p(ko_test) && mrb_fixnum(ko_test) == 0 && mrb_fixnum_p(kill_test) && mrb_fixnum(kill_test) == 0;
40}
41
42static int
43eval_test(mrb_state *mrb)
44{
45 /* evaluate the test */
46 mrb_funcall(mrb, mrb_top_self(mrb), "report", 0);
47 /* did an exception occur? */
48 if (mrb->exc) {
49 mrb_print_error(mrb);
50 mrb->exc = 0;
51 return EXIT_FAILURE;
52 }
53 else if (!check_error(mrb)) {
54 return EXIT_FAILURE;
55 }
56 return EXIT_SUCCESS;
57}
58
59static void
60t_printstr(mrb_state *mrb, mrb_value obj)
61{
62 char *s;
63 int len;
64
65 if (mrb_string_p(obj)) {
66 s = RSTRING_PTR(obj);
67 len = RSTRING_LEN(obj);
68 fwrite(s, len, 1, stdout);
69 }
70}
71
72mrb_value
73mrb_t_printstr(mrb_state *mrb, mrb_value self)
74{
75 mrb_value argv;
76
77 mrb_get_args(mrb, "o", &argv);
78 t_printstr(mrb, argv);
79
80 return argv;
81}
82
83void
84mrb_init_test_driver(mrb_state *mrb, mrb_bool verbose)
85{
86 struct RClass *krn, *mrbtest;
87
88 krn = mrb->kernel_module;
89 mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1));
90
91 mrbtest = mrb_define_module(mrb, "Mrbtest");
92
93 mrb_define_const(mrb, mrbtest, "FIXNUM_MAX", mrb_fixnum_value(MRB_INT_MAX));
94 mrb_define_const(mrb, mrbtest, "FIXNUM_MIN", mrb_fixnum_value(MRB_INT_MIN));
95 mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT));
96
97#ifdef MRB_USE_FLOAT
98 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6));
99#else
100 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12));
101#endif
102
103 if (verbose) {
104 mrb_gv_set(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"), mrb_true_value());
105 }
106}
107
108void
109mrb_t_pass_result(mrb_state *mrb_dst, mrb_state *mrb_src)
110{
111 mrb_value res_src;
112
113 if (mrb_src->exc) {
114 mrb_print_error(mrb_src);
115 exit(EXIT_FAILURE);
116 }
117
118#define TEST_COUNT_PASS(name) \
119 do { \
120 res_src = mrb_gv_get(mrb_src, mrb_intern_lit(mrb_src, "$" #name)); \
121 if (mrb_fixnum_p(res_src)) { \
122 mrb_value res_dst = mrb_gv_get(mrb_dst, mrb_intern_lit(mrb_dst, "$" #name)); \
123 mrb_gv_set(mrb_dst, mrb_intern_lit(mrb_dst, "$" #name), mrb_fixnum_value(mrb_fixnum(res_dst) + mrb_fixnum(res_src))); \
124 } \
125 } while (FALSE) \
126
127 TEST_COUNT_PASS(ok_test);
128 TEST_COUNT_PASS(ko_test);
129 TEST_COUNT_PASS(kill_test);
130
131#undef TEST_COUNT_PASS
132
133 res_src = mrb_gv_get(mrb_src, mrb_intern_lit(mrb_src, "$asserts"));
134
135 if (mrb_array_p(res_src)) {
136 mrb_int i;
137 mrb_value res_dst = mrb_gv_get(mrb_dst, mrb_intern_lit(mrb_dst, "$asserts"));
138 for (i = 0; i < RARRAY_LEN(res_src); ++i) {
139 mrb_value val_src = RARRAY_PTR(res_src)[i];
140 mrb_ary_push(mrb_dst, res_dst, mrb_str_new(mrb_dst, RSTRING_PTR(val_src), RSTRING_LEN(val_src)));
141 }
142 }
143}
144
145int
146main(int argc, char **argv)
147{
148 mrb_state *mrb;
149 int ret;
150 mrb_bool verbose = FALSE;
151
152 print_hint();
153
154 /* new interpreter instance */
155 mrb = mrb_open();
156 if (mrb == NULL) {
157 fprintf(stderr, "Invalid mrb_state, exiting test driver");
158 return EXIT_FAILURE;
159 }
160
161 if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v') {
162 printf("verbose mode: enable\n\n");
163 verbose = TRUE;
164 }
165
166 mrb_init_test_driver(mrb, verbose);
167 mrb_init_mrbtest(mrb);
168 ret = eval_test(mrb);
169 mrb_close(mrb);
170
171 return ret;
172}
Note: See TracBrowser for help on using the repository browser.