- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/driver.c
r331 r439 19 19 #include <mruby/array.h> 20 20 21 void 22 mrb_init_mrbtest(mrb_state *); 21 extern const uint8_t mrbtest_assert_irep[]; 22 23 void mrbgemtest_init(mrb_state* mrb); 24 void mrb_init_test_vformat(mrb_state* mrb); 23 25 24 26 /* Print a short remark for the user */ … … 30 32 31 33 static int 32 check_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 42 static int43 34 eval_test(mrb_state *mrb) 44 35 { 45 36 /* evaluate the test */ 46 mrb_ funcall(mrb, mrb_top_self(mrb), "report", 0);37 mrb_value result = mrb_funcall(mrb, mrb_top_self(mrb), "report", 0); 47 38 /* did an exception occur? */ 48 39 if (mrb->exc) { … … 51 42 return EXIT_FAILURE; 52 43 } 53 else if (!check_error(mrb)) { 54 return EXIT_FAILURE; 55 } 56 return EXIT_SUCCESS; 57 } 58 59 static void 60 t_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 72 mrb_value 73 mrb_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; 44 else { 45 return mrb_bool(result) ? EXIT_SUCCESS : EXIT_FAILURE; 46 } 47 } 48 49 /* Implementation of print due to the reason that there might be no print */ 50 static mrb_value 51 t_print(mrb_state *mrb, mrb_value self) 52 { 53 mrb_value *argv; 54 mrb_int argc; 55 mrb_int i; 56 57 mrb_get_args(mrb, "*!", &argv, &argc); 58 for (i = 0; i < argc; ++i) { 59 mrb_value s = mrb_obj_as_string(mrb, argv[i]); 60 fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stdout); 61 } 62 fflush(stdout); 63 64 return mrb_nil_value(); 65 } 66 67 #define UNESCAPE(p, endp) ((p) != (endp) && *(p) == '\\' ? (p)+1 : (p)) 68 #define CHAR_CMP(c1, c2) ((unsigned char)(c1) - (unsigned char)(c2)) 69 70 static const char * 71 str_match_bracket(const char *p, const char *pat_end, 72 const char *s, const char *str_end) 73 { 74 mrb_bool ok = FALSE, negated = FALSE; 75 76 if (p == pat_end) return NULL; 77 if (*p == '!' || *p == '^') { 78 negated = TRUE; 79 ++p; 80 } 81 82 while (*p != ']') { 83 const char *t1 = p; 84 if ((t1 = UNESCAPE(t1, pat_end)) == pat_end) return NULL; 85 if ((p = t1 + 1) == pat_end) return NULL; 86 if (p[0] == '-' && p[1] != ']') { 87 const char *t2 = p + 1; 88 if ((t2 = UNESCAPE(t2, pat_end)) == pat_end) return NULL; 89 p = t2 + 1; 90 if (!ok && CHAR_CMP(*t1, *s) <= 0 && CHAR_CMP(*s, *t2) <= 0) ok = TRUE; 91 } 92 else { 93 if (!ok && CHAR_CMP(*t1, *s) == 0) ok = TRUE; 94 } 95 } 96 97 return ok == negated ? NULL : p + 1; 98 } 99 100 static mrb_bool 101 str_match_no_brace_p(const char *pat, mrb_int pat_len, 102 const char *str, mrb_int str_len) 103 { 104 const char *p = pat, *s = str; 105 const char *pat_end = pat + pat_len, *str_end = str + str_len; 106 const char *p_tmp = NULL, *s_tmp = NULL; 107 108 for (;;) { 109 if (p == pat_end) return s == str_end; 110 switch (*p) { 111 case '*': 112 do { ++p; } while (p != pat_end && *p == '*'); 113 if (UNESCAPE(p, pat_end) == pat_end) return TRUE; 114 if (s == str_end) return FALSE; 115 p_tmp = p; 116 s_tmp = s; 117 continue; 118 case '?': 119 if (s == str_end) return FALSE; 120 ++p; 121 ++s; 122 continue; 123 case '[': { 124 const char *t; 125 if (s == str_end) return FALSE; 126 if ((t = str_match_bracket(p+1, pat_end, s, str_end))) { 127 p = t; 128 ++s; 129 continue; 130 } 131 goto L_failed; 132 } 133 } 134 135 /* ordinary */ 136 p = UNESCAPE(p, pat_end); 137 if (s == str_end) return p == pat_end; 138 if (p == pat_end) goto L_failed; 139 if (*p++ != *s++) goto L_failed; 140 continue; 141 142 L_failed: 143 if (p_tmp && s_tmp) { 144 /* try next '*' position */ 145 p = p_tmp; 146 s = ++s_tmp; 147 continue; 148 } 149 150 return FALSE; 151 } 152 } 153 154 #define COPY_AND_INC(dst, src, len) \ 155 do { memcpy(dst, src, len); dst += len; } while (0) 156 157 static mrb_bool 158 str_match_p(mrb_state *mrb, 159 const char *pat, mrb_int pat_len, 160 const char *str, mrb_int str_len) 161 { 162 const char *p = pat, *pat_end = pat + pat_len; 163 const char *lbrace = NULL, *rbrace = NULL; 164 int nest = 0; 165 mrb_bool ret = FALSE; 166 167 for (; p != pat_end; ++p) { 168 if (*p == '{' && nest++ == 0) lbrace = p; 169 else if (*p == '}' && lbrace && --nest == 0) { rbrace = p; break; } 170 else if (*p == '\\' && ++p == pat_end) break; 171 } 172 173 if (lbrace && rbrace) { 174 /* expand brace */ 175 char *ex_pat = (char *)mrb_malloc(mrb, pat_len-2); /* expanded pattern */ 176 char *ex_p = ex_pat; 177 178 COPY_AND_INC(ex_p, pat, lbrace-pat); 179 p = lbrace; 180 while (p < rbrace) { 181 char *orig_ex_p = ex_p; 182 const char *t = ++p; 183 for (nest = 0; p < rbrace && !(*p == ',' && nest == 0); ++p) { 184 if (*p == '{') ++nest; 185 else if (*p == '}') --nest; 186 else if (*p == '\\' && ++p == rbrace) break; 187 } 188 COPY_AND_INC(ex_p, t, p-t); 189 COPY_AND_INC(ex_p, rbrace+1, pat_end-rbrace-1); 190 if ((ret = str_match_p(mrb, ex_pat, ex_p-ex_pat, str, str_len))) break; 191 ex_p = orig_ex_p; 192 } 193 mrb_free(mrb, ex_pat); 194 } 195 else if (!lbrace && !rbrace) { 196 ret = str_match_no_brace_p(pat, pat_len, str, str_len); 197 } 198 199 return ret; 200 } 201 202 static mrb_value 203 m_str_match_p(mrb_state *mrb, mrb_value self) 204 { 205 const char *pat, *str; 206 mrb_int pat_len, str_len; 207 208 mrb_get_args(mrb, "ss", &pat, &pat_len, &str, &str_len); 209 return mrb_bool_value(str_match_p(mrb, pat, pat_len, str, str_len)); 81 210 } 82 211 … … 87 216 88 217 krn = mrb->kernel_module; 89 mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1)); 218 mrb_define_method(mrb, krn, "t_print", t_print, MRB_ARGS_ANY()); 219 mrb_define_method(mrb, krn, "_str_match?", m_str_match_p, MRB_ARGS_REQ(2)); 90 220 91 221 mrbtest = mrb_define_module(mrb, "Mrbtest"); … … 95 225 mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT)); 96 226 227 #ifndef MRB_WITHOUT_FLOAT 97 228 #ifdef MRB_USE_FLOAT 98 229 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6)); … … 100 231 mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12)); 101 232 #endif 233 #endif 234 235 mrb_init_test_vformat(mrb); 102 236 103 237 if (verbose) { … … 128 262 TEST_COUNT_PASS(ko_test); 129 263 TEST_COUNT_PASS(kill_test); 264 TEST_COUNT_PASS(warning_test); 265 TEST_COUNT_PASS(skip_test); 130 266 131 267 #undef TEST_COUNT_PASS … … 165 301 166 302 mrb_init_test_driver(mrb, verbose); 167 mrb_init_mrbtest(mrb); 303 mrb_load_irep(mrb, mrbtest_assert_irep); 304 mrbgemtest_init(mrb); 168 305 ret = eval_test(mrb); 169 306 mrb_close(mrb);
Note:
See TracChangeset
for help on using the changeset viewer.