source: EcnlProtoTool/trunk/mruby-1.2.0/mrbgems/mruby-test/driver.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 4.0 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 if (verbose) {
98 mrb_gv_set(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"), mrb_true_value());
99 }
100}
101
102void
103mrb_t_pass_result(mrb_state *mrb_dst, mrb_state *mrb_src)
104{
105 mrb_value res_src;
106
107 if (mrb_src->exc) {
108 mrb_print_error(mrb_src);
109 exit(EXIT_FAILURE);
110 }
111
112#define TEST_COUNT_PASS(name) \
113 do { \
114 res_src = mrb_gv_get(mrb_src, mrb_intern_lit(mrb_src, "$" #name)); \
115 if (mrb_fixnum_p(res_src)) { \
116 mrb_value res_dst = mrb_gv_get(mrb_dst, mrb_intern_lit(mrb_dst, "$" #name)); \
117 mrb_gv_set(mrb_dst, mrb_intern_lit(mrb_dst, "$" #name), mrb_fixnum_value(mrb_fixnum(res_dst) + mrb_fixnum(res_src))); \
118 } \
119 } while (FALSE) \
120
121 TEST_COUNT_PASS(ok_test);
122 TEST_COUNT_PASS(ko_test);
123 TEST_COUNT_PASS(kill_test);
124
125#undef TEST_COUNT_PASS
126
127 res_src = mrb_gv_get(mrb_src, mrb_intern_lit(mrb_src, "$asserts"));
128
129 if (mrb_array_p(res_src)) {
130 mrb_int i;
131 mrb_value res_dst = mrb_gv_get(mrb_dst, mrb_intern_lit(mrb_dst, "$asserts"));
132 for (i = 0; i < RARRAY_LEN(res_src); ++i) {
133 mrb_value val_src = RARRAY_PTR(res_src)[i];
134 mrb_ary_push(mrb_dst, res_dst, mrb_str_new(mrb_dst, RSTRING_PTR(val_src), RSTRING_LEN(val_src)));
135 }
136 }
137}
138
139int
140main(int argc, char **argv)
141{
142 mrb_state *mrb;
143 int ret;
144 mrb_bool verbose = FALSE;
145
146 print_hint();
147
148 /* new interpreter instance */
149 mrb = mrb_open();
150 if (mrb == NULL) {
151 fprintf(stderr, "Invalid mrb_state, exiting test driver");
152 return EXIT_FAILURE;
153 }
154
155 if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v') {
156 printf("verbose mode: enable\n\n");
157 verbose = TRUE;
158 }
159
160 mrb_init_test_driver(mrb, verbose);
161 mrb_init_mrbtest(mrb);
162 ret = eval_test(mrb);
163 mrb_close(mrb);
164
165 return ret;
166}
Note: See TracBrowser for help on using the repository browser.