NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
run_test.cpp
Go to the documentation of this file.
1#ifdef BUILD_UNITTEST
2
3#include "warning_push.h"
4#include <gtest/gtest.h>
5
6#include <torch/torch.h>
7#include <ATen/ATen.h>
8#include "warning_pop.h"
9
10
11#include "parser.h"
12
13#include <signal.h>
14
15#include "builtin.h"
16#include "runtime.h"
17#include "context.h"
18
19using namespace newlang;
20
21TEST(Run, Simple) {
22 RuntimePtr rt = RunTime::Init();
23 ASSERT_TRUE(rt);
24
25 ObjPtr res = jit->Run("123");
26 ASSERT_TRUE(res);
27 ASSERT_STREQ("123", res->toString().c_str());
28 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
29
30 res = jit->Run("123.456");
31 ASSERT_TRUE(res);
32 ASSERT_STREQ("123.456", res->toString().c_str());
33 ASSERT_EQ(2, rt->m_main_ast->m_block.size());
34
35 res = jit->Run("'123.456'");
36 ASSERT_TRUE(res);
37 ASSERT_STREQ("'123.456'", res->toString().c_str());
38 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
39
40 res = jit->Run("\"123.456\"");
41 ASSERT_TRUE(res);
42 ASSERT_STREQ("\"123.456\"", res->toString().c_str());
43 ASSERT_EQ(4, rt->m_main_ast->m_block.size());
44
45 res = jit->Run("(,)");
46 ASSERT_TRUE(res);
47 ASSERT_STREQ("(,)", res->toString().c_str());
48 ASSERT_EQ(5, rt->m_main_ast->m_block.size());
49
50 res = jit->Run("(123,)");
51 ASSERT_TRUE(res);
52 ASSERT_STREQ("(123,)", res->toString().c_str());
53 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
54
55 res = jit->Run("(name=123,)");
56 ASSERT_TRUE(res);
57 ASSERT_STREQ("(name=123,)", res->toString().c_str());
58 ASSERT_EQ(7, rt->m_main_ast->m_block.size());
59
60 res = jit->Run("(name=123,):ClassName");
61 ASSERT_TRUE(res);
62 ASSERT_STREQ("(name=123,):ClassName", res->toString().c_str());
63 ASSERT_EQ(8, rt->m_main_ast->m_block.size());
64
65 res = jit->Run("[123,]");
66 ASSERT_TRUE(res);
67 ASSERT_STREQ("[123,]:Int8", res->toString().c_str());
68 ASSERT_EQ(9, rt->m_main_ast->m_block.size());
69
70 res = jit->Run("[123,456,]:Float32");
71 ASSERT_TRUE(res);
72 ASSERT_STREQ("[123, 456,]:Float32", res->toString().c_str());
73 ASSERT_EQ(10, rt->m_main_ast->m_block.size());
74}
75
76TEST(Run, Vars) {
77
78 // for (int i = 0; i < 5; i++) {
79 // int val = i; /// val := i
80 // static int stat = i; /// @::stat := i ???????????????????????????
81 // std::cout << i << " -> " << val << " stat " << stat << "\n";
82 // }
83
84
85 RuntimePtr rt = RunTime::Init();
86 ASSERT_TRUE(rt);
87 size_t glob_count = rt->size();
88
89 ObjPtr res = jit->Run("::var_glob := 123");
90 ASSERT_TRUE(res);
91 ASSERT_EQ(1, rt->size() - glob_count);
92 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
93 ASSERT_EQ(0, rt->m_main_runner->size()) << rt->m_main_runner->Dump();
94 ASSERT_EQ(1, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
95 ASSERT_STREQ("123", res->toString().c_str());
96
97 res = jit->Run("var_mod := 456");
98 ASSERT_TRUE(res);
99 ASSERT_STREQ("456", res->toString().c_str());
100 ASSERT_EQ(1, rt->size() - glob_count);
101 ASSERT_EQ(2, rt->m_main_ast->m_block.size());
102 ASSERT_EQ(0, rt->m_main_runner->size());
103 ASSERT_EQ(2, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
104
105
106 res = jit->Run("$var_loc := 789");
107 ASSERT_TRUE(res);
108 ASSERT_STREQ("789", res->toString().c_str());
109 ASSERT_EQ(1, rt->size() - glob_count);
110 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
111 ASSERT_EQ(0, rt->m_main_runner->size());
112 ASSERT_EQ(3, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
113
114
115 res = jit->Run("::var_glob2 := var_glob");
116 ASSERT_TRUE(res);
117 ASSERT_STREQ("123", res->toString().c_str());
118 ASSERT_EQ(2, rt->size() - glob_count);
119 ASSERT_EQ(4, rt->m_main_ast->m_block.size());
120 ASSERT_EQ(0, rt->m_main_runner->size());
121 ASSERT_EQ(4, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
122
123 ASSERT_ANY_THROW(jit->Run("var_mod ::= 0")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
124 ASSERT_ANY_THROW(jit->Run("var_mod2 = 0")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
125 ASSERT_NO_THROW(res = jit->Run("var_mod2 ::= var_mod")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
126 ASSERT_TRUE(res);
127 ASSERT_STREQ("456", res->toString().c_str());
128 ASSERT_EQ(2, rt->size() - glob_count);
129 ASSERT_EQ(5, rt->m_main_ast->m_block.size());
130 ASSERT_EQ(0, rt->m_main_runner->size());
131 ASSERT_EQ(5, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
132
133 ASSERT_NO_THROW(res = jit->Run("$var_loc2 := $var_loc")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
134 ASSERT_TRUE(res);
135 ASSERT_STREQ("789", res->toString().c_str());
136 ASSERT_EQ(2, rt->size() - glob_count);
137 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
138 ASSERT_EQ(0, rt->m_main_runner->size());
139 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
140
141
142
143 ASSERT_ANY_THROW(jit->Run("::var_glob2 ::= -1"));
144 res = jit->Run("::var_glob2 = -1");
145 ASSERT_TRUE(res);
146 ASSERT_STREQ("-1", res->toString().c_str());
147 ASSERT_EQ(2, rt->size() - glob_count);
148 ASSERT_EQ(7, rt->m_main_ast->m_block.size());
149 ASSERT_EQ(0, rt->m_main_runner->size());
150 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
151
152
153 ASSERT_NO_THROW(res = jit->Run("var_mod2 = -2")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
154 ASSERT_TRUE(res);
155 ASSERT_STREQ("-2", res->toString().c_str());
156 ASSERT_EQ(2, rt->size() - glob_count);
157 ASSERT_EQ(8, rt->m_main_ast->m_block.size());
158 ASSERT_EQ(0, rt->m_main_runner->size());
159 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
160
161 ASSERT_ANY_THROW(jit->Run("$var_loc2 ::= -3"));
162 res = jit->Run("$var_loc2 = -3");
163 ASSERT_TRUE(res);
164 ASSERT_STREQ("-3", res->toString().c_str());
165 ASSERT_EQ(2, rt->size() - glob_count);
166 ASSERT_EQ(9, rt->m_main_ast->m_block.size());
167 ASSERT_EQ(0, rt->m_main_runner->size());
168 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
169
170 res = jit->Run("@::glob := -5");
171 ASSERT_TRUE(res);
172 ASSERT_STREQ("-5", res->toString().c_str());
173 ASSERT_EQ(2, rt->size() - glob_count);
174 ASSERT_EQ(10, rt->m_main_ast->m_block.size());
175 ASSERT_EQ(0, rt->m_main_runner->size());
176 ASSERT_EQ(7, rt->m_main_ast->m_int_vars.size());
177
178}
179
180TEST(Run, Call) {
181
182 RuntimePtr rt = RunTime::Init();
183 ASSERT_TRUE(rt);
184 size_t glob_count = rt->size();
185 ASSERT_FALSE(rt->m_main_ast);
186 ASSERT_FALSE(rt->m_main_runner);
187
188 ObjPtr res = jit->Run("::func_glob() := { 123 }");
189 ASSERT_TRUE(res);
190 ASSERT_EQ(1, rt->size() - glob_count) << Dump(*rt);
191 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
192 ASSERT_EQ(0, rt->m_main_runner->size());
193 ASSERT_EQ(1, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
194 ASSERT_STREQ("::func_glob::(){ }", res->toString().c_str());
195
196 res = jit->Run("::func_glob()");
197 ASSERT_TRUE(res);
198 ASSERT_STREQ("123", res->toString().c_str());
199
200 ASSERT_ANY_THROW(jit->Run("::func_glob ::= {}")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
201 ASSERT_ANY_THROW(jit->Run("::func_glob = {}")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
202
203
204 res = jit->Run("func_loc() := { 456 }");
205 ASSERT_TRUE(res);
206 ASSERT_EQ(1, rt->size() - glob_count);
207 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
208 ASSERT_EQ(0, rt->m_main_runner->size());
209 ASSERT_EQ(2, rt->m_main_ast->m_int_vars.size());
210 ASSERT_STREQ("func_loc::(){ }", res->toString().c_str());
211
212 ASSERT_NO_THROW(res = jit->Run("func_loc()")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
213
214 ASSERT_TRUE(res);
215 ASSERT_STREQ("456", res->toString().c_str());
216
217 ASSERT_NO_THROW(res = jit->Run("$func_loc()")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
218
219 ASSERT_TRUE(res);
220 ASSERT_STREQ("456", res->toString().c_str());
221
222 res = jit->Run("@::func() := { 789 }");
223 ASSERT_TRUE(res);
224 ASSERT_EQ(1, rt->size() - glob_count);
225 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
226 ASSERT_EQ(0, rt->m_main_runner->size());
227 ASSERT_EQ(3, rt->m_main_ast->m_int_vars.size());
228 ASSERT_STREQ("@::func::(){ }", res->toString().c_str());
229
230 ASSERT_NO_THROW(res = jit->Run("@::func()")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
231 ASSERT_TRUE(res);
232 ASSERT_STREQ("789", res->toString().c_str());
233
234 ASSERT_NO_THROW(res = jit->Run("func()")) << Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
235 ASSERT_TRUE(res);
236 ASSERT_STREQ("789", res->toString().c_str());
237}
238
239//TEST(Run, CallArgs) {
240//
241// RuntimePtr rt = RunTime::Init();
242// ASSERT_TRUE(rt);
243// size_t glob_count = rt->size();
244// ASSERT_FALSE(rt->m_main_ast);
245// ASSERT_FALSE(rt->m_main_runner);
246//
247// ObjPtr res;
248// ASSERT_NO_THROW(res = jit->Run("::func_glob(arg) := { $arg }"));
249// ASSERT_TRUE(res);
250// ASSERT_EQ(1, rt->size() - glob_count);
251// ASSERT_EQ(1, rt->m_main_ast->m_block.size());
252// ASSERT_EQ(1, rt->m_main_runner->size());
253// ASSERT_EQ(1, rt->m_main_ast->m_variables.size());
254// ASSERT_STREQ("::func_glob(arg){ }", res->toString().c_str());
255//
256// res = jit->Run("::func_glob(123)");
257// ASSERT_TRUE(res);
258// ASSERT_STREQ("123", res->toString().c_str());
259//
260// ASSERT_ANY_THROW(jit->Run("::func_glob() := {}")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
261// ASSERT_ANY_THROW(jit->Run("::func_glob(arg) := {}")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
262//
263//
264// res = jit->Run("func_loc(arg=123) := { $arg }");
265// ASSERT_TRUE(res);
266// ASSERT_EQ(1, rt->size() - glob_count);
267// ASSERT_EQ(3, rt->m_main_ast->m_block.size());
268// ASSERT_EQ(2, rt->m_main_runner->size());
269// ASSERT_EQ(2, rt->m_main_ast->m_variables.size());
270// ASSERT_STREQ("$func_loc(){ }", res->toString().c_str());
271//
272// ASSERT_NO_THROW(res = jit->Run("$func_loc()")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
273// ASSERT_TRUE(res);
274// ASSERT_STREQ("123", res->toString().c_str());
275//
276// ASSERT_NO_THROW(res = jit->Run("$func_loc(456)")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
277// ASSERT_TRUE(res);
278// ASSERT_STREQ("456", res->toString().c_str());
279//
280//
281// res = jit->Run("@::func(...) := { $* }");
282// ASSERT_TRUE(res);
283// ASSERT_EQ(1, rt->size() - glob_count);
284// ASSERT_EQ(5, rt->m_main_ast->m_block.size());
285// ASSERT_EQ(3, rt->m_main_runner->size());
286// ASSERT_EQ(3, rt->m_main_ast->m_variables.size());
287// ASSERT_STREQ("$func(){ }", res->toString().c_str());
288//
289// ASSERT_NO_THROW(res = jit->Run("$func()")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
290// ASSERT_TRUE(res);
291// ASSERT_STREQ("(,)", res->toString().c_str());
292//
293// ASSERT_NO_THROW(res = jit->Run("$func(123)")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
294// ASSERT_TRUE(res);
295// ASSERT_STREQ("(123,)", res->toString().c_str());
296//
297// ASSERT_NO_THROW(res = jit->Run("$func(123, 456)")) << rt->m_main_runner->Dump() << rt->m_main_ast->m_variables.Dump();
298// ASSERT_TRUE(res);
299// ASSERT_STREQ("(123, 456,)", res->toString().c_str());
300//}
301
302
303static int64_t var_long = 987654321;
304
305static int64_t func_export(int64_t arg_long, uint8_t arg_byte) {
306 return arg_long + 2 * arg_byte;
307}
308
309TEST(Eval, Assign) {
310
311 RuntimePtr rt = RunTime::Init();
312
313 ObjPtr list = jit->Run("$?!");
314 ASSERT_STREQ("(,)", list->toString().c_str());
315
316 ObjPtr var1 = jit->Run("var1 ::= 123");
317 ASSERT_TRUE(var1);
318 ASSERT_TRUE(var1->is_arithmetic_type());
319 ASSERT_TRUE(var1->is_integer());
320 ASSERT_TRUE(std::holds_alternative<int64_t>(var1->m_var));
321 ASSERT_EQ(var1->m_var_type_current, ObjType::Int8) << newlang::toString(var1->m_var_type_current);
322 ASSERT_EQ(var1->m_var_type_fixed, ObjType::None) << newlang::toString(var1->m_var_type_fixed);
323 ASSERT_STREQ("123", var1->toString().c_str());
324
325 list = jit->Run("$?!");
326 ASSERT_STREQ("('var1',)", list->toString().c_str());
327
328 ASSERT_ANY_THROW(jit->Run("var1 ::= 123"));
329
330 ASSERT_NO_THROW(var1 = jit->Run("var1 = 100:Int8"));
331 ASSERT_EQ(var1->m_var_type_current, ObjType::Int8) << newlang::toString(var1->m_var_type_current);
332 ASSERT_EQ(var1->m_var_type_fixed, ObjType::Int8) << newlang::toString(var1->m_var_type_fixed);
333 ASSERT_STREQ("100", var1->toString().c_str());
334
335 ASSERT_NO_THROW(var1 = jit->Run("var1 = 999"));
336 ASSERT_STREQ("999", var1->toString().c_str());
337
338 ASSERT_NO_THROW(var1 = jit->Run("var1 = _"));
339 ASSERT_EQ(var1->getType(), ObjType::None);
340 ASSERT_STREQ("_", var1->toString().c_str());
341
342 list = jit->Run("$?!");
343 ASSERT_STREQ("('var1',)", list->toString().c_str());
344
345 // ASSERT_TRUE(ctx.ExecStr("var1 = "));
346 // ASSERT_TRUE(ctx.select("var1").complete());
347 rt->Clear();
348
349 list = jit->Run("$?!");
350 ASSERT_STREQ("(,)", list->toString().c_str());
351
352 ObjPtr var_str;
353 ASSERT_NO_THROW(var_str = jit->Run("var_str := 'Строка'"));
354 ASSERT_TRUE(var_str);
355 ASSERT_TRUE(var_str->is_string_type());
356 ASSERT_EQ(var_str->m_var_type_current, ObjType::StrChar) << newlang::toString(var_str->m_var_type_current);
357 ASSERT_EQ(var_str->m_var_type_fixed, ObjType::String) << newlang::toString(var_str->m_var_type_fixed);
358 ASSERT_STREQ("'Строка'", var_str->toString().c_str());
359
360 list = jit->Run("$?!");
361 ASSERT_STREQ("('var_str',)", list->toString().c_str());
362
363 ObjPtr var_num;
364 ASSERT_NO_THROW(var_num = jit->Run("$var_num := 123.456: Single"));
365 ASSERT_TRUE(var_num);
366 ASSERT_TRUE(var_num->is_arithmetic_type());
367 ASSERT_TRUE(var_num->is_tensor_type());
368 ASSERT_EQ(var_num->m_var_type_current, ObjType::Single) << newlang::toString(var_num->m_var_type_current);
369 ASSERT_EQ(var_num->m_var_type_fixed, ObjType::Single) << newlang::toString(var_num->m_var_type_fixed);
370 ASSERT_STREQ("123.456", var_num->toString().c_str());
371
372 list = jit->Run("$?!");
373 ASSERT_STREQ("('$var_num', 'var_str',)", list->toString().c_str());
374
375
376 var_long = 987654321;
377 ObjPtr var_export;
378
379 ASSERT_ANY_THROW(jit->Run("var_export:= %var_long"));
380 ASSERT_ANY_THROW(jit->Run("var_export:= %var_long..."));
381 ASSERT_ANY_THROW(jit->Run("var_export:Int64 := %var_long:Int32 "));
382 ASSERT_ANY_THROW(jit->Run("var_export := %var_long:Int64 "));
383
384 ASSERT_ANY_THROW(var_export = jit->Run("var_export:Int64 := %var_long..."));
385
386 LLVMAddSymbol("var_long", &var_long);
387
388 ASSERT_NO_THROW(var_export = jit->Run("var_export:Int64 := %var_long..."));
389
390 ASSERT_TRUE(var_export);
391 ASSERT_TRUE(var_export->is_tensor_type()) << var_export->toString();
392 ASSERT_EQ(var_export->getType(), ObjType::Int64);
393 ASSERT_STREQ("987654321", var_export->toString().c_str());
394 var_long = 123132132;
395 ASSERT_STREQ("123132132", var_export->toString().c_str());
396 var_export->SetValue_(Obj::CreateValue(59875, ObjType::None));
397 ASSERT_EQ(59875, var_long);
398
399 list = jit->Run("$?!");
400 ASSERT_STREQ("('var_export', '$var_num', 'var_str',)", list->toString().c_str());
401
402
403 /*
404 * Аргументы по умолчанию для нативных функций.
405 * Функция шаблон для создания списка аргументов для встраиваемого кода,
406 * чтобы было как в C/C++ func_export(10, 20), а не func_export( (10, 20,) )
407 * + проверка компилятором, например:
408 * extern "C" _$$_func_export$( Obj &args );
409 * extern "C" _$$_func_export$_$(int64_t arg_long, uint8_t arg_byte);
410 * тогда при раскрытии EMBED {% $func_export(10, 20) %}?
411 * $func_export заменяется на _$$_func_export$_$ и компилятор будет счстлив проверкой аргументов :-)
412 */
413 ObjPtr func;
414 ASSERT_ANY_THROW(jit->Run("$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export"));
415 ASSERT_ANY_THROW(jit->Run("$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export..."));
416
417 LLVMAddSymbol("func_export", (void *) &func_export);
418
419 ASSERT_NO_THROW(func = jit->Run("$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export..."));
420
421 ASSERT_TRUE(func);
422 ASSERT_TRUE(func->is_function_type()) << func;
423 ASSERT_EQ(func->getType(), ObjType::NativeFunc);
424 ASSERT_STREQ("$func_export::(arg1:Int64, arg2:Int8):Int64{ }", func->toString().c_str());
425
426 ObjPtr result = (*func)(200, 10);
427 ASSERT_TRUE(result);
428 ASSERT_EQ(220, result->GetValueAsInteger());
429
430 result = (*func)(10, 10);
431 ASSERT_TRUE(result);
432 ASSERT_EQ(30, result->GetValueAsInteger());
433
434 // result = (*func)({10, "arg2"}, {20, "arg1"});
435 // ASSERT_TRUE(result);
436 // ASSERT_EQ(40, result->GetValueAsInteger());
437
438 // result = (*func_export)(10);
439 // ASSERT_TRUE(result);
440 // ASSERT_EQ(110, result.GetValueAsInteger());
441
442
443
444 // Переполнение второго аргумента
445 // ASSERT_ANY_THROW(func_export->Call(&ctx, Obj::Arg(1000), Obj::Arg(1000)));
446 //
447 // list = ctx.ExecStr("$$");
448 // ASSERT_STREQ("$$=('var_str', 'var_num', 'var_export', 'func_export',)", list->toString().c_str());
449 //
450 // var_num.reset();
451 // func_export.reset();
452 //
453 // list = ctx.ExecStr("$$");
454 // ASSERT_STREQ("$$=('var_str', 'var_export',)", list->toString().c_str());
455 //
456 // // Функция возвращает словарь с именами объектов в текущем контексте
457 // ObjPtr func_eval = ctx.ExecStr("func_eval(arg1, arg2) := {$$;}");
458 // ASSERT_TRUE(func_eval);
459 // ASSERT_TRUE(func_eval->is_function_type()) << func_eval;
460 // ASSERT_EQ(func_eval->getType(), ObjType::EVAL_FUNCTION) << toString(func_eval->getType());
461 // ASSERT_STREQ("func_eval=::func_eval(arg1, arg2):={$$;}", func_eval->toString().c_str());
462 //
463 // ObjPtr result_eval = func_eval->Call(&ctx, Obj::Arg(200), Obj::Arg(10));
464 // ASSERT_TRUE(result_eval);
465 // ASSERT_STREQ("$$=('$0', 'arg1', 'arg2', 'var_str', 'var_export', 'func_eval',)", result_eval->toString().c_str());
466 //
467 // list = ctx.ExecStr("$$");
468 // ASSERT_STREQ("$$=('var_str', 'var_export', 'func_eval',)", list->toString().c_str());
469 //
470 //
471 // ObjPtr dict1 = ctx.ExecStr("(10, 2, 3, 4, )");
472 // ASSERT_TRUE(dict1);
473 // ASSERT_EQ(ObjType::Dictionary, dict1->m_var_type_current) << toString(dict1->m_var_type_current);
474 // ASSERT_EQ(ObjType::None, dict1->m_var_type_fixed) << toString(dict1->m_var_type_fixed);
475 // ASSERT_EQ(4, dict1->size());
476 // ASSERT_STREQ("(10, 2, 3, 4,)", dict1->toString().c_str());
477 //
478 // ObjPtr dict2 = ctx.ExecStr("( (10, 2, 3, 4, (1,2,), ), (10, 2, 3, 4, ),)");
479 // ASSERT_TRUE(dict2);
480 // ASSERT_EQ(ObjType::Dictionary, dict2->m_var_type_current) << toString(dict2->m_var_type_current);
481 // ASSERT_EQ(ObjType::None, dict2->m_var_type_fixed) << toString(dict2->m_var_type_fixed);
482 // ASSERT_EQ(2, dict2->size());
483 // ASSERT_STREQ("((10, 2, 3, 4, (1, 2,),), (10, 2, 3, 4,),)", dict2->toString().c_str());
484 //
485 // ObjPtr tensor = ctx.ExecStr("[1,1,0,0,]");
486 // ASSERT_TRUE(tensor);
487 // ASSERT_EQ(ObjType::Bool, tensor->m_var_type_current) << toString(tensor->m_var_type_current);
488 // ASSERT_EQ(ObjType::None, tensor->m_var_type_fixed) << toString(tensor->m_var_type_fixed);
489 // ASSERT_EQ(1, tensor->m_tensor->dim());
490 // ASSERT_EQ(4, tensor->m_tensor->size(0));
491 // ASSERT_EQ(1, tensor->index_get({0})->GetValueAsInteger());
492 // ASSERT_EQ(1, tensor->index_get({1})->GetValueAsInteger());
493 // ASSERT_EQ(0, tensor->index_get({2})->GetValueAsInteger());
494 // ASSERT_EQ(0, tensor->index_get({3})->GetValueAsInteger());
495 //
496 // ASSERT_STREQ("[1, 1, 0, 0,]:Bool", tensor->GetValueAsString().c_str());
497 //
498 // ObjPtr tensor2 = ctx.ExecStr("[222,333,3333,]");
499 // ASSERT_TRUE(tensor2);
500 // ASSERT_STREQ("[222, 333, 3333,]:Int16", tensor2->GetValueAsString().c_str());
501 //
502 // ObjPtr tensorf = ctx.ExecStr("[1.2, 0.22, 0.69,]");
503 // ASSERT_TRUE(tensorf);
504 // ASSERT_STREQ("[1.2, 0.22, 0.69,]:Float32", tensorf->GetValueAsString().c_str());
505 //
506 // ObjPtr tensor_all = ctx.ExecStr("[ [1, 1, 0, 0,], [10, 10, 0.1, 0.2,], ]");
507 // ASSERT_TRUE(tensor_all);
508 // ASSERT_EQ(ObjType::Float32, tensor_all->m_var_type_current) << toString(tensor_all->m_var_type_current);
509 // ASSERT_EQ(ObjType::None, tensor_all->m_var_type_fixed) << toString(tensor_all->m_var_type_fixed);
510 // ASSERT_EQ(2, tensor_all->m_tensor->dim()) << tensor_all->m_tensor->size(0);
511 // ASSERT_EQ(2, tensor_all->m_tensor->size(0));
512 // ASSERT_EQ(4, tensor_all->m_tensor->size(1));
513 //
514 // ASSERT_STREQ("1", tensor_all->index_get({0, 0})->GetValueAsString().c_str());
515 // ASSERT_STREQ("1", tensor_all->index_get({0, 1})->GetValueAsString().c_str());
516 // ASSERT_STREQ("0", tensor_all->index_get({0, 2})->GetValueAsString().c_str());
517 // ASSERT_STREQ("0", tensor_all->index_get({0, 3})->GetValueAsString().c_str());
518 //
519 // ASSERT_STREQ("10", tensor_all->index_get({1, 0})->GetValueAsString().c_str());
520 // ASSERT_STREQ("10", tensor_all->index_get({1, 1})->GetValueAsString().c_str());
521 // ASSERT_STREQ("0.1", tensor_all->index_get({1, 2})->GetValueAsString().c_str());
522 // ASSERT_STREQ("0.2", tensor_all->index_get({1, 3})->GetValueAsString().c_str());
523 //
524 // ASSERT_STREQ("[\n [1, 1, 0, 0,], [10, 10, 0.1, 0.2,],\n]:Float32", tensor_all->GetValueAsString().c_str());
525}
526
527TEST(Run, Tensor) {
528
529 RuntimePtr rt = RunTime::Init();
530 ASSERT_TRUE(rt);
531
532 ObjPtr ddd;
533
534 ASSERT_NO_THROW(ddd = jit->Run("(1,2,3,)"));
535 ASSERT_TRUE(ddd);
536 ASSERT_STREQ("(1, 2, 3,)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
537
538 ASSERT_NO_THROW(ddd = jit->Run(":Tensor[...]( (1,2,3,) )")); // << Dump(*rt);
539 ASSERT_TRUE(ddd);
540 ASSERT_STREQ("[1, 2, 3,]:Int8", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
541
542
543 ASSERT_NO_THROW(ddd = jit->Run(":Dictionary(1,2,3)"));
544 ASSERT_TRUE(ddd);
545 ASSERT_STREQ("(1, 2, 3,)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
546
547 ASSERT_NO_THROW(ddd = jit->Run(":Dictionary( (1,2,3,) )"));
548 ASSERT_TRUE(ddd);
549 ASSERT_STREQ("((1, 2, 3,),)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
550
551 ObjPtr tensor;
552 ASSERT_NO_THROW(tensor = jit->Run(":Tensor(1)"));
553 ASSERT_TRUE(tensor);
554 ASSERT_EQ(ObjType::Tensor, tensor->m_var_type_fixed) << toString(tensor->m_var_type_fixed);
555 ASSERT_EQ(ObjType::Bool, tensor->getType()) << toString(tensor->m_var_type_current);
556 ASSERT_EQ(0, tensor->size());
557
558 ASSERT_STREQ("1", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
559
560 ASSERT_NO_THROW(tensor = jit->Run("(1,2,3,)"));
561 ASSERT_TRUE(tensor);
562 ASSERT_STREQ("(1, 2, 3,)", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
563
564 ASSERT_NO_THROW(tensor = jit->Run(":Tensor[...]([1,2,3,])"));
565 ASSERT_TRUE(tensor);
566 ASSERT_STREQ("[1, 2, 3,]:Int8", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
567
568 ASSERT_NO_THROW(tensor = jit->Run(":Int32[_]([1,])"));
569 ASSERT_TRUE(tensor);
570 ASSERT_STREQ("[1,]:Int32", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
571
572 ASSERT_NO_THROW(tensor = jit->Run(":Int32([1,])"));
573 ASSERT_TRUE(tensor);
574 ASSERT_STREQ("1", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
575
576 ObjPtr tt;
577 ASSERT_NO_THROW(tt = jit->Run(":Tensor[3]( (1,2,3,) )"));
578 ASSERT_TRUE(tt);
579 ASSERT_STREQ("[1, 2, 3,]:Int8", tt->GetValueAsString().c_str()) << tt->GetValueAsString().c_str();
580
581 ASSERT_NO_THROW(tensor = jit->Run(":Int32[...]((1,2,3,))"));
582 ASSERT_TRUE(tensor);
583 ASSERT_STREQ("[1, 2, 3,]:Int32", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
584
585 ASSERT_NO_THROW(tensor = jit->Run(":Int32[2,3]((1,2,3,4,5,6,))"));
586 ASSERT_TRUE(tensor);
587
588 EXPECT_EQ(2, tensor->m_tensor->dim());
589 EXPECT_EQ(2, tensor->m_tensor->size(0));
590 EXPECT_EQ(3, tensor->m_tensor->size(1));
591
592 ASSERT_STREQ("[\n [1, 2, 3,], [4, 5, 6,],\n]:Int32", tensor->GetValueAsString().c_str());
593
594 ObjPtr str;
595 ASSERT_NO_THROW(str = jit->Run(":Tensor[_]('first second')"));
596 ASSERT_TRUE(str);
597 ASSERT_STREQ("[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8", str->GetValueAsString().c_str());
598
599 ASSERT_NO_THROW(tt = jit->Run(":Tensor[...]((item1='first', space=32, item3='second',))"));
600 ASSERT_TRUE(tt);
601 ASSERT_STREQ("[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8", tt->GetValueAsString().c_str());
602
603 ASSERT_TRUE(str->op_equal(tt));
604
605 ASSERT_NO_THROW(tt = jit->Run(":Int32[7,2](\"Тензор Int32 \")"));
606 ASSERT_TRUE(tt);
607 ASSERT_STREQ("[\n [1058, 1077,], [1085, 1079,], [1086, 1088,], [32, 73,], "
608 "[110, 116,], [51, 50,], [32, 32,],\n]:Int32",
609 tt->GetValueAsString().c_str());
610
611 ASSERT_NO_THROW(tt = jit->Run(":Tensor(99)"));
612 ASSERT_TRUE(tt);
613 ASSERT_STREQ("99", tt->GetValueAsString().c_str());
614
615 ASSERT_NO_THROW(tt = jit->Run(":Float64[10,2](0, ... )"));
616 ASSERT_TRUE(tt);
617 ASSERT_STREQ("[\n [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, "
618 "0,], [0, 0,], [0, 0,], [0, 0,],\n]:Float64",
619 tt->GetValueAsString().c_str());
620
621}
622
623TEST(Run, Comprehensions) {
624
625 RuntimePtr rt = RunTime::Init();
626 ASSERT_TRUE(rt);
627
628 ObjPtr srand;
629 ASSERT_NO_THROW(srand = jit->Run("srand(seed:Int32):None ::= %srand..."));
630
631 ObjPtr ret = (*srand)(100);
632 ASSERT_TRUE(ret);
633 ASSERT_TRUE(ret->is_none_type());
634
635 ObjPtr rand;
636 ASSERT_NO_THROW(rand = jit->Run("rand():Int32 ::= %rand ... "));
637
638 ObjPtr tt;
639 // Может быть раскрытие словаря, который возвращает вызов функции
640 // и может быть многократный вызов одной и той функции
641 // :Int32[3,2]( ... rand() ... )
642 Logger::LogLevelType save = Logger::Instance()->SetLogLevel(LOG_LEVEL_INFO);
643 ASSERT_NO_THROW(tt = jit->Run(":Int32[3,2]( 42, ... rand() ... )"));
644 Logger::Instance()->SetLogLevel(save);
645
646 ASSERT_TRUE(tt);
647 std::string rand_str = tt->GetValueAsString();
648 ASSERT_TRUE(50 < tt->GetValueAsString().size()) << rand_str;
649 //ASSERT_STREQ("[\n [42, 677741240,], [611911301, 516687479,], [1039653884, 807009856,],\n]:Int32", tt->GetValueAsString().c_str()) << rand_str;
650
651
652 ASSERT_NO_THROW(tt = jit->Run(":Int32[5,2]( ... 0..10 )"));
653 ASSERT_TRUE(tt);
654 ASSERT_STREQ("[\n [0, 1,], [2, 3,], [4, 5,], [6, 7,], [8, 9,],\n]:Int32", tt->GetValueAsString().c_str());
655
656 ASSERT_NO_THROW(tt = jit->Run(":Float64[5,2]( 0..10 )"));
657 ASSERT_TRUE(tt);
658 ASSERT_STREQ("[\n [0, 1,], [2, 3,], [4, 5,], [6, 7,], [8, 9,],\n]:Float64", tt->GetValueAsString().c_str());
659
660 ASSERT_NO_THROW(tt = jit->Run("0..1..0.1"));
661 ASSERT_TRUE(tt);
662 ASSERT_STREQ("0..1..0.1", tt->toString().c_str());
663
664 ASSERT_NO_THROW(tt = jit->Run(":Tensor[_]( ... 0..0.99..0.1 )"));
665 ASSERT_TRUE(tt);
666 ASSERT_STREQ("[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,]:Float64", tt->GetValueAsString().c_str());
667
668 // ASSERT_NO_THROW(tt = jit->Run(":Tensor( ... 0..0.99..0.1:Float32 )"));
669 // ASSERT_TRUE(tt);
670 // ASSERT_STREQ("[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,]:Float32", tt->GetValueAsString().c_str());
671
672 ASSERT_NO_THROW(tt = jit->Run(":Tensor[10]( 1, 2, ... )"));
673 ASSERT_TRUE(tt);
674 ASSERT_STREQ("[1, 2, 1, 2, 1, 2, 1, 2, 1, 2,]:Int8", tt->GetValueAsString().c_str());
675
676 ASSERT_NO_THROW(tt = jit->Run(":Tensor[10]( 1, 2, ... 0 ...)"));
677 ASSERT_TRUE(tt);
678 ASSERT_STREQ("[1, 2, 0, 0, 0, 0, 0, 0, 0, 0,]:Int8", tt->GetValueAsString().c_str());
679
680 ASSERT_NO_THROW(tt = jit->Run(":Tensor[14]( 99, 100, ... 0..5, ... )"));
681 ASSERT_TRUE(tt);
682 ASSERT_STREQ("[99, 100, 0, 1, 2, 3, 4, 99, 100, 0, 1, 2, 3, 4,]:Int8", tt->GetValueAsString().c_str());
683
684 ObjPtr dict;
685 ASSERT_NO_THROW(dict = jit->Run(":Dictionary( ... 0..0.99..0.1 )"));
686 ASSERT_TRUE(dict);
687 ASSERT_STREQ("(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,)", dict->GetValueAsString().c_str());
688
689 ASSERT_NO_THROW(dict = jit->Run(":Dictionary( ... 10..0..-1\\1 )"));
690 ASSERT_TRUE(dict);
691 ASSERT_STREQ("(10\\1, 9\\1, 8\\1, 7\\1, 6\\1, 5\\1, 4\\1, 3\\1, 2\\1, 1\\1,)", dict->GetValueAsString().c_str());
692
693 ASSERT_NO_THROW(dict = jit->Run("dict ::= ( 1, two=2, .three=3,)"));
694 ASSERT_TRUE(dict);
695 ASSERT_STREQ("(1, two=2, three=3,)", dict->GetValueAsString().c_str());
696
697 ObjPtr dd;
698 ASSERT_NO_THROW(dd = jit->Run(":Dictionary( 0, ... dict)"));
699 ASSERT_TRUE(dd);
700 ASSERT_STREQ("(0, 1, 2, 3,)", dd->GetValueAsString().c_str());
701
702 ASSERT_NO_THROW(dd = jit->Run(":Dictionary( 0, ... ... dict, end=42)"));
703 ASSERT_TRUE(dd);
704 ASSERT_STREQ("(0, 1, two=2, three=3, end=42,)", dd->GetValueAsString().c_str());
705
706
707 ASSERT_TRUE(rt->m_diag->m_fill_remainder);
708 ASSERT_ANY_THROW(tt = jit->Run(":Tensor[16]( 99, 100, ... 0..5, ... )"));
709 rt->m_diag->m_fill_remainder = false;
710 ASSERT_NO_THROW(tt = jit->Run(":Tensor[16]( 99, 100, ... 0..5, ... )"));
711 ASSERT_TRUE(tt);
712 ASSERT_STREQ("[99, 100, 0, 1, 2, 3, 4, 99, 100, 0, 1, 2, 3, 4, 99, 100,]:Int8", tt->GetValueAsString().c_str());
713
714}
715
716
1361
1362TEST(Run, Iterator) {
1363
1364 RuntimePtr rt = RunTime::Init();
1365
1366 ObjPtr dict;
1367 ASSERT_NO_THROW(dict = jit->Run("dict := ('1'=1, \"22\"=2, '333'=3, 4, \"555\"=5,)"));
1368 ASSERT_TRUE(dict);
1369 ASSERT_EQ(5, dict->size());
1370 ASSERT_EQ(1, dict->at(0).second->GetValueAsInteger());
1371 ASSERT_EQ(2, dict->at(1).second->GetValueAsInteger());
1372 ASSERT_EQ(3, dict->at(2).second->GetValueAsInteger());
1373 ASSERT_EQ(4, dict->at(3).second->GetValueAsInteger());
1374 ASSERT_EQ(5, dict->at(4).second->GetValueAsInteger());
1375 ASSERT_STREQ("1", dict->at(0).first.c_str());
1376 ASSERT_STREQ("22", dict->at(1).first.c_str());
1377 ASSERT_STREQ("333", dict->at(2).first.c_str());
1378 ASSERT_STREQ("", dict->at(3).first.c_str());
1379 ASSERT_STREQ("555", dict->at(4).first.c_str());
1380
1381 ObjPtr dict1;
1382 ASSERT_NO_THROW(dict1 = jit->Run("dict??"));
1383 ASSERT_TRUE(dict1);
1384 ASSERT_EQ(5, dict1->size());
1385 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1386 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1387 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1388 ASSERT_EQ(4, dict1->at(3).second->GetValueAsInteger());
1389 ASSERT_EQ(5, dict1->at(4).second->GetValueAsInteger());
1390 ASSERT_STREQ("1", dict1->at(0).first.c_str());
1391 ASSERT_STREQ("22", dict1->at(1).first.c_str());
1392 ASSERT_STREQ("333", dict1->at(2).first.c_str());
1393 ASSERT_STREQ("", dict1->at(3).first.c_str());
1394 ASSERT_STREQ("555", dict1->at(4).first.c_str());
1395
1396
1397 ObjPtr iter_d = dict->IteratorMake();
1398
1399 ASSERT_TRUE(iter_d);
1400 ASSERT_EQ(iter_d->getType(), ObjType::Iterator);
1401
1402 ASSERT_STREQ("1", iter_d->IteratorData()->toString().c_str());
1403 ASSERT_STREQ("1", iter_d->IteratorNext(0)->toString().c_str());
1404
1405 ASSERT_STREQ("2", iter_d->IteratorData()->toString().c_str());
1406 ASSERT_STREQ("2", iter_d->IteratorNext(0)->toString().c_str());
1407
1408 ASSERT_STREQ("3", iter_d->IteratorData()->toString().c_str());
1409 ASSERT_STREQ("3", iter_d->IteratorNext(0)->toString().c_str());
1410
1411 ASSERT_STREQ("4", iter_d->IteratorData()->toString().c_str());
1412 ASSERT_STREQ("4", iter_d->IteratorNext(0)->toString().c_str());
1413
1414 ASSERT_STREQ("5", iter_d->IteratorData()->toString().c_str());
1415 ASSERT_STREQ("5", iter_d->IteratorNext(0)->toString().c_str());
1416
1417 ASSERT_STREQ(":IteratorEnd", iter_d->IteratorData()->toString().c_str());
1418 ObjPtr iter_end = iter_d->IteratorNext(0);
1419 ASSERT_TRUE(iter_end);
1420 EXPECT_EQ(ObjType::IteratorEnd, iter_end->getType()) << newlang::toString(iter_end->getType());
1421 EXPECT_FALSE(iter_end->GetValueAsBoolean());
1422 ASSERT_STREQ(":IteratorEnd", iter_end->IteratorData()->toString().c_str());
1423
1424 iter_end = iter_d->IteratorNext(0);
1425 ASSERT_TRUE(iter_end);
1426 ASSERT_EQ(ObjType::IteratorEnd, iter_end->getType());
1427 ASSERT_FALSE(iter_end->GetValueAsBoolean());
1428 ASSERT_STREQ(":IteratorEnd", iter_d->IteratorData()->toString().c_str());
1429
1430
1431 ObjPtr iter;
1432 ASSERT_NO_THROW(iter = jit->Run("it := dict?"));
1433
1434 ASSERT_TRUE(iter);
1435 ASSERT_EQ(ObjType::Iterator, iter->getType()) << toString(iter->getType());
1436 ASSERT_TRUE(iter->m_iterator);
1437
1438 ASSERT_TRUE(iter->m_iterator->begin() != iter->m_iterator->end());
1439 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->begin());
1440
1441 ObjPtr one;
1442 ASSERT_NO_THROW(one = jit->Run("it!"));
1443 ASSERT_TRUE(one);
1444 ASSERT_EQ(1, dict->at(0).second->GetValueAsInteger());
1445
1446 ASSERT_NO_THROW(one = jit->Run("it!"));
1447 ASSERT_TRUE(one);
1448 ASSERT_EQ(2, one->GetValueAsInteger());
1449
1450 ASSERT_NO_THROW(one = jit->Run("@next(it)"));
1451 ASSERT_TRUE(one);
1452 ASSERT_EQ(3, one->GetValueAsInteger());
1453
1454 ASSERT_NO_THROW(one = jit->Run("it!"));
1455 ASSERT_TRUE(one);
1456 ASSERT_EQ(4, one->GetValueAsInteger());
1457
1458 ASSERT_NO_THROW(one = jit->Run("it!"));
1459 ASSERT_TRUE(one);
1460 ASSERT_EQ(5, one->GetValueAsInteger());
1461
1462 ASSERT_NO_THROW(one = jit->Run("it!"));
1463 ASSERT_TRUE(one);
1464 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one << " " << toString(one->getType());
1465
1466 ASSERT_NO_THROW(one = jit->Run("it!"));
1467 ASSERT_TRUE(one);
1468 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one << " " << toString(one->getType());
1469
1470 // "@@ iter( obj, ... ) @@ ::= @@ @$obj ? (@$...) @@"
1471 // "@@ next( obj, ... ) @@ ::= @@ @$obj ! (@$...) @@"
1472 // "@@ curr( obj ) @@ ::= @@ @$obj !? @@"
1473 // "@@ first( obj ) @@ ::= @@ @$obj !! @@"
1474 // "@@ all( obj ) @@ ::= @@ @$obj ?? @@"
1475
1476
1477 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1478 ASSERT_NO_THROW(one = jit->Run("it!!"));
1479 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1480
1481 ASSERT_NO_THROW(dict1 = jit->Run("it??(-3)"));
1482 ASSERT_TRUE(dict1);
1483 ASSERT_EQ(3, dict1->size());
1484 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1485 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1486 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1487
1488 ObjPtr dict2;
1489 ASSERT_NO_THROW(dict2 = jit->Run("it??(-3)"));
1490 ASSERT_TRUE(dict2);
1491 ASSERT_EQ(3, dict2->size());
1492 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
1493 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
1494 ASSERT_EQ(ObjType::IteratorEnd, dict2->at(2).second->getType());
1495
1496 ObjPtr dict3;
1497 ASSERT_NO_THROW(dict3 = jit->Run("it??(-3)"));
1498 ASSERT_TRUE(dict3);
1499 ASSERT_EQ(3, dict1->size());
1500 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(0).second->getType());
1501 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(1).second->getType());
1502 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(2).second->getType());
1503
1504
1505
1506 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1507 ASSERT_NO_THROW(jit->Run("it!!"));
1508 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1509
1510 ASSERT_NO_THROW(dict1 = jit->Run("it??(3)"));
1511 ASSERT_TRUE(dict1);
1512 ASSERT_EQ(3, dict1->size());
1513 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1514 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1515 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1516
1517 ASSERT_NO_THROW(dict2 = jit->Run("it??(3)"));
1518 ASSERT_TRUE(dict2);
1519 ASSERT_EQ(2, dict2->size());
1520 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
1521 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
1522
1523 ASSERT_NO_THROW(dict3 = jit->Run("it??(3)"));
1524 ASSERT_TRUE(dict3);
1525 ASSERT_EQ(0, dict3->size());
1526
1527
1528
1529 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1530 ASSERT_NO_THROW(jit->Run("it!!"));
1531 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1532
1533 ObjPtr flt_res;
1534 ASSERT_NO_THROW(flt_res = jit->Run("dict??('')"));
1535 ASSERT_TRUE(flt_res);
1536 ASSERT_EQ(1, flt_res->size());
1537 ASSERT_EQ(4, flt_res->at(0).second->GetValueAsInteger());
1538
1539
1540 ObjPtr flt1_res;
1541 ASSERT_NO_THROW(flt1_res = jit->Run("dict??('.',100)"));
1542 ASSERT_TRUE(flt1_res);
1543 ASSERT_EQ(1, flt1_res->size());
1544 ASSERT_EQ(1, flt1_res->at(0).second->GetValueAsInteger());
1545
1546
1547 ObjPtr flt2_res;
1548 ASSERT_NO_THROW(flt2_res = jit->Run("dict??('..',100)"));
1549 ASSERT_TRUE(flt2_res);
1550 ASSERT_EQ(1, flt2_res->size());
1551 ASSERT_EQ(2, flt2_res->at(0).second->GetValueAsInteger());
1552
1553 ObjPtr flt3_res;
1554 ASSERT_NO_THROW(flt3_res = jit->Run("dict??('...',100)"));
1555 ASSERT_TRUE(flt3_res);
1556 ASSERT_EQ(2, flt3_res->size());
1557 ASSERT_EQ(3, flt3_res->at(0).second->GetValueAsInteger());
1558 ASSERT_EQ(5, flt3_res->at(1).second->GetValueAsInteger());
1559
1560
1561
1562 ObjPtr range_test;
1563 ASSERT_NO_THROW(range_test = jit->Run("1\\1..1..-1"));
1564 ASSERT_TRUE(range_test);
1565 ASSERT_EQ(3, range_test->size());
1566 ASSERT_STREQ("1\\1", range_test->at(0).second->GetValueAsString().c_str());
1567 ASSERT_STREQ("1\\1", range_test->at(1).second->GetValueAsString().c_str());
1568 ASSERT_STREQ("-1\\1", range_test->at(2).second->GetValueAsString().c_str());
1569 ASSERT_STREQ("1\\1..1\\1..-1\\1", range_test->GetValueAsString().c_str());
1570
1571 // ObjPtr iter_test = ctx.ExecStr("(1,'sss',(,),2,3,)??", nullptr, true);
1572 // ASSERT_TRUE(iter_test);
1573 // ASSERT_STREQ("(1, 'sss', (,), 2, 3,)", iter_test->GetValueAsString().c_str());
1574
1575 ObjPtr iter_dict;
1576 ASSERT_NO_THROW(iter_dict = jit->Run("1..1..-1??"));
1577 ASSERT_TRUE(iter_dict);
1578 ASSERT_STREQ("(,)", iter_dict->GetValueAsString().c_str());
1579
1580 ASSERT_NO_THROW(iter_dict = jit->Run("2..1..-1??"));
1581 ASSERT_TRUE(iter_dict);
1582 ASSERT_STREQ("(2,)", iter_dict->GetValueAsString().c_str());
1583
1584 ASSERT_NO_THROW(iter_dict = jit->Run("3..1..-1??"));
1585 ASSERT_TRUE(iter_dict);
1586 ASSERT_STREQ("(3, 2,)", iter_dict->GetValueAsString().c_str());
1587
1588 ASSERT_NO_THROW(iter_dict = jit->Run("3\\1..1..-1??"));
1589 ASSERT_TRUE(iter_dict);
1590 ASSERT_STREQ("(3\\1, 2\\1,)", iter_dict->GetValueAsString().c_str());
1591
1592 ObjPtr iter_test;
1593 ASSERT_NO_THROW(iter_test = jit->Run("iter_test := 3\\1..1..-1?"));
1594 ASSERT_TRUE(iter_test);
1595 ASSERT_TRUE(iter_test->m_iterator);
1596 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1597 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj->m_iter_range_value);
1598 ASSERT_STREQ("3\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str()) << iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str();
1599 ASSERT_EQ(iter_test->getType(), ObjType::Iterator);
1600
1601 ObjPtr while_test;
1602
1603 ASSERT_NO_THROW(while_test = jit->Run("[@next(iter_test)]<->{- --'EXIT'-- -}"));
1604 ASSERT_TRUE(while_test);
1605 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1606 ASSERT_STREQ(":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1607
1608 ASSERT_NO_THROW(while_test = jit->Run("$^"));
1609 ASSERT_TRUE(while_test);
1610 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1611 ASSERT_STREQ(":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1612
1613 ASSERT_NO_THROW(while_test = jit->Run("@latter"));
1614 ASSERT_TRUE(while_test);
1615 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1616 ASSERT_STREQ(":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1617
1618 ASSERT_NO_THROW(while_test = jit->Run("* $^"));
1619 ASSERT_TRUE(while_test);
1620 ASSERT_TRUE(while_test->is_string_type()) << while_test->toString();
1621 ASSERT_STREQ("'EXIT'", while_test->toString().c_str()) << while_test->toString();
1622
1623
1624 ASSERT_NO_THROW(while_test = jit->Run("[iter_test!]<->{+ ++'PLUS'++ +}"));
1625 ASSERT_TRUE(while_test);
1626 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1627 ASSERT_STREQ(":RetPlus('PLUS')", while_test->toString().c_str()) << while_test->toString();
1628
1629
1630 ASSERT_NO_THROW(iter_dict = jit->Run("iter_dict := (1,2,3,)?"));
1631 ASSERT_TRUE(iter_dict);
1632 // ASSERT_TRUE(iter_dict->m_iterator->m_iter_obj->m_iter_range_value);
1633 // ASSERT_STREQ("3\\1", iter_dict->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str()) << iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str();
1634 ASSERT_EQ(iter_dict->getType(), ObjType::Iterator);
1635
1636 ASSERT_NO_THROW(while_test = jit->Run("[iter_dict!]<->{+ ++'EXIT'++ +}"));
1637 ASSERT_TRUE(while_test);
1638 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1639 ASSERT_STREQ(":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1640
1641 ASSERT_NO_THROW(while_test = jit->Run("$^"));
1642 ASSERT_TRUE(while_test);
1643 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1644 ASSERT_STREQ(":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1645
1646 ASSERT_NO_THROW(while_test = jit->Run("@latter"));
1647 ASSERT_TRUE(while_test);
1648 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1649 ASSERT_STREQ(":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1650
1651 ASSERT_NO_THROW(while_test = jit->Run("*@latter"));
1652 ASSERT_TRUE(while_test);
1653 ASSERT_TRUE(while_test->is_string_type()) << while_test->toString();
1654 ASSERT_STREQ("'EXIT'", while_test->toString().c_str()) << while_test->toString();
1655
1656
1657 ASSERT_NO_THROW(iter_test = jit->Run("iter_test := @iter(3\\1..1..-1)"));
1658
1659 ObjPtr item_val;
1660 ASSERT_NO_THROW(item_val = jit->Run("@curr(iter_test)"));
1661 ASSERT_TRUE(item_val);
1662 ASSERT_STREQ("3\\1", item_val->GetValueAsString().c_str());
1663
1664 ASSERT_NO_THROW(item_val = jit->Run("@next(iter_test)"));
1665 ASSERT_TRUE(item_val);
1666 ASSERT_STREQ("3\\1", item_val->GetValueAsString().c_str());
1667
1668 ASSERT_NO_THROW(item_val = jit->Run("iter_test!?"));
1669 ASSERT_TRUE(item_val);
1670 ASSERT_STREQ("2\\1", item_val->GetValueAsString().c_str());
1671
1672 ASSERT_NO_THROW(item_val = jit->Run("iter_test?!"));
1673 ASSERT_TRUE(item_val);
1674 ASSERT_STREQ("2\\1", item_val->GetValueAsString().c_str());
1675
1676 ASSERT_STREQ(":Iterator", iter_test->GetValueAsString().c_str());
1677 ASSERT_TRUE(iter_test->m_iterator);
1678 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1679 ASSERT_STREQ("2\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1680 ASSERT_STREQ("3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1681
1682 ASSERT_NO_THROW(item_val = jit->Run("@next(iter_test)"));
1683 ASSERT_TRUE(item_val);
1684 ASSERT_STREQ("2\\1", item_val->GetValueAsString().c_str());
1685 ASSERT_TRUE(item_val->GetValueAsBoolean());
1686
1687 ASSERT_STREQ(":Iterator", iter_test->GetValueAsString().c_str());
1688 ASSERT_TRUE(iter_test->m_iterator);
1689 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1690 ASSERT_STREQ("1\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1691 ASSERT_STREQ("3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1692
1693 ASSERT_NO_THROW(item_val = jit->Run("@next(iter_test)"));
1694 ASSERT_TRUE(item_val);
1695
1696 ASSERT_STREQ(":Iterator", iter_test->GetValueAsString().c_str());
1697 ASSERT_TRUE(iter_test->m_iterator);
1698 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1699 ASSERT_STREQ("1\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1700 ASSERT_STREQ("3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1701
1702
1703
1704 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1705 ASSERT_STREQ("3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1706
1707 ASSERT_STREQ(":IteratorEnd", item_val->GetValueAsString().c_str());
1708 ASSERT_FALSE(item_val->GetValueAsBoolean());
1709
1710 ASSERT_NO_THROW(item_val = jit->Run("iter_test"));
1711 ASSERT_TRUE(item_val);
1712 ASSERT_STREQ(":Iterator", item_val->GetValueAsString().c_str());
1713
1714 ASSERT_STREQ(":IteratorEnd", item_val->IteratorData()->GetValueAsString().c_str());
1715 ASSERT_FALSE(item_val->IteratorNext(0)->GetValueAsBoolean());
1716
1717 ASSERT_NO_THROW(while_test = jit->Run("[iter_test?!]<->{ --'EXIT'-- }"));
1718 ASSERT_TRUE(while_test);
1719 ASSERT_STRNE("EXIT", while_test->GetValueAsString().c_str()) << while_test->GetValueAsString().c_str();
1720
1721
1722 ASSERT_NO_THROW(item_val = jit->Run("@first(iter_test)"));
1723 ASSERT_TRUE(item_val);
1724 ASSERT_STREQ("3\\1", item_val->GetValueAsString().c_str());
1725
1726
1727}
1728
1837
1838class RunTester : public ::testing::Test {
1839protected:
1840 RuntimePtr m_rt;
1841 ObjPtr m_result;
1842 std::string m_string;
1843
1844 RunTester() : m_rt(RunTime::Init()) {
1845 }
1846
1847 const char *Test(std::string eval, Obj *vars) {
1848 eval += ";";
1849 m_result = m_jit->Run(eval, vars);
1850 if (m_result) {
1851 m_string = m_result->GetValueAsString();
1852 return m_string.c_str();
1853 }
1854 std::cout << "Fail parsing: '" << eval << "'\n";
1855 ADD_FAILURE();
1856
1857 return nullptr;
1858 }
1859
1860 const char *Test(const char *eval) {
1861 Obj vars;
1862
1863 return Test(eval, &vars);
1864 }
1865};
1866
1867TEST_F(RunTester, Ops) {
1868 ASSERT_STREQ("10", Test("10"));
1869 ASSERT_STREQ("32", Test("10+22"));
1870 ASSERT_STREQ("5.1", Test("1.1+4"));
1871 ASSERT_STREQ("5.5", Test("1+4.5"));
1872
1873 ASSERT_STREQ("10\\1", Test("10\\1"));
1874 ASSERT_STREQ("32\\1", Test("10\\1+22\\1"));
1875 ASSERT_STREQ("5\\1", Test("4\\5 + 42\\10"));
1876 ASSERT_STREQ("11\\1", Test("10\\1 + 1"));
1877 ASSERT_STREQ("4\\3", Test("1\\3 + 1"));
1878
1879 ASSERT_STREQ("-12", Test("10 - 22"));
1880 ASSERT_STREQ("-2.9", Test("1.1 - 4"));
1881 ASSERT_STREQ("-3.5", Test("1 - 4.5"));
1882 ASSERT_STREQ("-17\\5", Test("4\\5 - 42\\10"));
1883 ASSERT_STREQ("-9\\10", Test("1\\10 - 1"));
1884 ASSERT_STREQ("-2\\3", Test("1\\3 - 1"));
1885
1886 ASSERT_STREQ("66", Test("2 * 33"));
1887 ASSERT_STREQ("-5.5", Test("1.1 * -5"));
1888 ASSERT_STREQ("180", Test("10 * 18"));
1889 ASSERT_STREQ("66\\1", Test("2\\1 * 66\\2"));
1890 ASSERT_STREQ("-15\\1", Test("3\\1 * -5"));
1891 ASSERT_STREQ("9\\5", Test("18\\100 * 10"));
1892
1893 ASSERT_STREQ("5", Test("10/2"));
1894 ASSERT_STREQ("5.05", Test("10.1 / 2"));
1895 ASSERT_STREQ("0.1", Test("1 / 10"));
1896 ASSERT_STREQ("0.1", Test("1.0 / 10"));
1897
1898 ASSERT_STREQ("4\\3", Test("12\\3 / 3"));
1899 ASSERT_STREQ("1\\1", Test("5\\10 / 1\\2"));
1900 ASSERT_STREQ("1\\100", Test("1\\10 / 10"));
1901
1902 ASSERT_STREQ("5", Test("10//2"));
1903 ASSERT_STREQ("5", Test("10.0 // 2"));
1904 ASSERT_STREQ("0", Test("1 // 10"));
1905 ASSERT_STREQ("7", Test("15 // 2"));
1906 ASSERT_STREQ("-8", Test("-15 // 2"));
1907 ASSERT_STREQ("2", Test("25 // 10"));
1908 ASSERT_STREQ("-3", Test("-25 // 10"));
1909 ASSERT_STREQ("-3", Test("-30 // 10"));
1910 ASSERT_STREQ("-4", Test("-31 // 10"));
1911
1912 // ASSERT_STREQ("100", Test("2*20+10*5"));
1913
1914 ASSERT_STREQ("", Test("\"\""));
1915 ASSERT_STREQ(" ", Test("\" \""));
1916 ASSERT_STREQ("строка", Test("\"\" \"строка\" "));
1917 ASSERT_STREQ("строка 222", Test("\"строка \" \"222\" "));
1918 // ASSERT_STREQ("строка строка строка ", Test("\"строка \" * 3 "));
1919
1920 ASSERT_STREQ("100", Test("$var1:=100"));
1921 ObjPtr var1 = m_result;
1922 ASSERT_TRUE(var1);
1923 ASSERT_STREQ("('$var1',)", Test("$?!"));
1924 ASSERT_STREQ("100", Test("var1"));
1925
1926 ObjPtr vars = Obj::CreateDict(Obj::Arg(var1, "var1"));
1927
1928 // ASSERT_ANY_THROW(Test("$var1"));
1929 ASSERT_NO_THROW(Test("$var1", vars.get()));
1930 ASSERT_STREQ("100", Test("$var1", vars.get()));
1931
1932 ASSERT_STREQ("20", Test("$var2:=9+11"));
1933 ObjPtr var2 = m_result;
1934 ASSERT_TRUE(var2);
1935 ASSERT_STREQ("('$var1', '$var2',)", Test("$!?"));
1936 ASSERT_STREQ("20", Test("var2"));
1937
1938 // ASSERT_ANY_THROW(Test("$var2"));
1939 // ASSERT_ANY_THROW(Test("$var2", vars.get()));
1940 vars->push_back(Obj::Arg(var2, "var2"));
1941
1942 ASSERT_NO_THROW(Test("$var2", vars.get()));
1943 ASSERT_STREQ("20", Test("$var2", vars.get()));
1944
1945 ASSERT_STREQ("100", Test("var1"));
1946 ASSERT_STREQ("120", Test("var1+=var2"));
1947 ASSERT_STREQ("('$var1', '$var2',)", Test("$!?"));
1948
1949 ASSERT_STREQ("120", Test("$var1", vars.get()));
1950
1951 ASSERT_NO_THROW(Test("var1 := _"));
1952 ASSERT_STREQ("('$var1', '$var2',)", Test("$?!"));
1953 ASSERT_NO_THROW(Test("var2 := _"));
1954 ASSERT_STREQ("('$var1', '$var2',)", Test("$?!"));
1955}
1956
2223
2224
2225
2226using namespace newlang;
2227
2228TEST(RunTest, Empty) {
2229 Obj var;
2230 ASSERT_TRUE(var.empty());
2231 ASSERT_EQ(ObjType::None, var.getType());
2232}
2233
2234TEST(RunTest, Value) {
2235 Obj var;
2236
2237 var.SetValue_(0);
2238 ASSERT_EQ(ObjType::Bool, var.getType());
2239
2240 var.SetValue_(1);
2241 ASSERT_EQ(ObjType::Bool, var.getType());
2242
2243 var.SetValue_(1.0);
2244 ASSERT_EQ(ObjType::Float32, var.getType());
2245
2246 var.SetValue_(1.0E+40);
2247 ASSERT_EQ(ObjType::Float64, var.getType());
2248
2249 var.SetValue_(true);
2250 ASSERT_EQ(ObjType::Bool, var.getType());
2251
2252 var.SetValue_(2);
2253 ASSERT_EQ(ObjType::Int8, var.getType());
2254
2255 var.SetValue_(-100);
2256 ASSERT_EQ(ObjType::Int8, var.getType());
2257
2258 var.SetValue_(1000);
2259 ASSERT_EQ(ObjType::Int16, var.getType());
2260
2261 var.SetValue_(100000);
2262 ASSERT_EQ(ObjType::Int32, var.getType());
2263
2264 var.SetValue_(10000000000);
2265 ASSERT_EQ(ObjType::Int64, var.getType());
2266
2267 var.SetValue_(2.0);
2268 ASSERT_EQ(ObjType::Float32, var.getType());
2269
2270 var.SetValue_(2.0E+40);
2271 ASSERT_EQ(ObjType::Float64, var.getType());
2272
2273 var.SetValue_(false);
2274 ASSERT_EQ(ObjType::Bool, var.getType());
2275}
2276
2277TEST(RunTest, String) {
2278 Obj var;
2279
2280 var.SetValue_(std::string("test"));
2281 ASSERT_EQ(ObjType::StrChar, var.getType()) << toString(var.getType());
2282
2283 Obj str1;
2284 str1.SetValue_(L"Test str");
2285 ASSERT_EQ(ObjType::StrWide, str1.getType()) << toString(str1.getType());
2286
2287 Obj str2;
2288 str2.SetValue_(std::string("test2"));
2289 ASSERT_EQ(ObjType::StrChar, str2.getType()) << toString(str2.getType());
2290
2291 ObjPtr str_byte = Obj::CreateString("byte");
2292 ASSERT_STREQ("byte", str_byte->GetValueAsString().c_str());
2293 ASSERT_EQ(4, str_byte->size());
2294 ASSERT_EQ(4, str_byte->m_value.size());
2295 ASSERT_STREQ("b", (*str_byte)[0].second->GetValueAsString().c_str());
2296 ASSERT_STREQ("y", (*str_byte)[1].second->GetValueAsString().c_str());
2297 ASSERT_STREQ("t", (*str_byte)[2].second->GetValueAsString().c_str());
2298 ASSERT_STREQ("e", (*str_byte)[3].second->GetValueAsString().c_str());
2299
2300 str_byte->op_set_index(0, "B");
2301 str_byte->op_set_index(1, "Y");
2302 ASSERT_STREQ("BYte", str_byte->GetValueAsString().c_str());
2303 str_byte->op_set_index(2, "T");
2304 str_byte->op_set_index(3, "E");
2305 ASSERT_STREQ("BYTE", str_byte->GetValueAsString().c_str());
2306
2307 ObjPtr str_char = Obj::CreateString(L"строка");
2308 ASSERT_EQ(6, str_char->size());
2309 ASSERT_EQ(6, str_char->m_string.size());
2310
2311 ASSERT_STREQ("с", (*str_char)[0].second->GetValueAsString().c_str());
2312 ASSERT_STREQ("т", (*str_char)[1].second->GetValueAsString().c_str());
2313 ASSERT_STREQ("р", (*str_char)[2].second->GetValueAsString().c_str());
2314 ASSERT_STREQ("о", (*str_char)[3].second->GetValueAsString().c_str());
2315 ASSERT_STREQ("к", (*str_char)[4].second->GetValueAsString().c_str());
2316 ASSERT_STREQ("а", (*str_char)[5].second->GetValueAsString().c_str());
2317
2318 str_char->op_set_index(0, "С");
2319 str_char->op_set_index(1, "Т");
2320 ASSERT_STREQ("СТрока", str_char->GetValueAsString().c_str());
2321 str_char->op_set_index(2, "Р");
2322 str_char->op_set_index(3, "О");
2323 ASSERT_STREQ("СТРОка", str_char->GetValueAsString().c_str());
2324
2325
2326 // ObjPtr format = Obj::CreateString("$1 $2 ${name}");
2327 // ObjPtr str11 = (*format)();
2328 // ASSERT_STREQ("$1 $2 ${name}", str11->GetValueAsString().c_str());
2329 //
2330 // ObjPtr str22 = (*format)(Obj::Arg(100));
2331 // ASSERT_STREQ("100 $2 ${name}", str22->GetValueAsString().c_str());
2332 // str22 = (*format)(100);
2333 // ASSERT_STREQ("100 $2 ${name}", str22->GetValueAsString().c_str());
2334 //
2335 // ObjPtr str3 = (*format)(Obj::Arg(-1), Obj::Arg("222"));
2336 // ASSERT_STREQ("-1 222 ${name}", str3->GetValueAsString().c_str());
2339 //
2340 // ObjPtr str4 = (*format)(Obj::Arg("value", "name"));
2341 // ASSERT_STREQ("value $2 value", str4->GetValueAsString().c_str());
2342 //
2343 // format = Obj::CreateString("$nameno ${имя1} $name $имя");
2344 // ObjPtr str5 = (*format)(Obj::Arg("value", "name"), Obj::Arg("УТФ8-УТФ8", "имя"), Obj::Arg("УТФ8", "имя1"));
2345 // ASSERT_STREQ("valueno УТФ8 value УТФ8-УТФ8", str5->GetValueAsString().c_str());
2346
2347}
2348
2349TEST(RunTest, Dict) {
2350
2351 RuntimePtr rt = RunTime::Init();
2352 ASSERT_TRUE(rt);
2353
2354 Obj var(ObjType::Dictionary);
2355 ASSERT_TRUE(var.empty());
2356 EXPECT_ANY_THROW(var[0]);
2357
2358 ASSERT_EQ(0, var.size());
2359 ObjPtr var2;
2360 ASSERT_NO_THROW(var2 = jit->Run("(,)"));
2361
2362 var.push_back(Obj::CreateString("Test1"));
2363 ASSERT_EQ(1, var.size());
2364 var.push_back(Obj::CreateString("Test3"));
2365 ASSERT_EQ(2, var.size());
2366 var.insert(var.at_index_const(1), Obj::Arg(2, "2"));
2367 var.insert(var.at_index_const(0), Obj::Arg(0, "0"));
2368 ASSERT_EQ(4, var.size());
2369
2370 ASSERT_TRUE(var[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2371 ASSERT_TRUE(var[1].second->op_accurate(Obj::CreateString("Test1")));
2372 ASSERT_TRUE(var[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2373 ASSERT_TRUE(var[3].second->op_accurate(Obj::CreateString(L"Test3")));
2374
2375 ASSERT_NO_THROW(var2 = jit->Run("(0, \"Test1\", 2, 'Test3',)"));
2376
2377 ASSERT_TRUE((*var2)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2378 ASSERT_TRUE((*var2)[1].second->op_accurate(Obj::CreateString("Test1")));
2379 ASSERT_TRUE((*var2)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2380 ASSERT_TRUE((*var2)[3].second->op_accurate(Obj::CreateString(L"Test3")));
2381
2382 ObjPtr var3;
2383
2384 ASSERT_NO_THROW(var3 = jit->Run("(0, \"Test1\", 2, 'Test3',)"));
2385
2386 ASSERT_TRUE((*var3)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2387 ASSERT_TRUE((*var3)[1].second->op_accurate(Obj::CreateString("Test1")));
2388 ASSERT_TRUE((*var3)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2389 ASSERT_TRUE((*var3)[3].second->op_accurate(Obj::CreateString(L"Test3")));
2390}
2391
2392TEST(RunTest, AsMap) {
2393
2394 ObjPtr map = Obj::CreateType(ObjType::Dictionary);
2395 ASSERT_TRUE(map->empty());
2396 EXPECT_ANY_THROW((*map)["test1"]);
2397 ASSERT_EQ(0, map->size());
2398
2399 ObjPtr temp = Obj::CreateString("Test");
2400 map->push_back(temp, "test1");
2401 map->push_back(Obj::CreateValue(100, ObjType::None), "test2");
2402 ASSERT_EQ(2, map->size());
2403 ASSERT_STREQ((*map)["test1"].second->toString().c_str(), temp->toString().c_str()) << temp->toString().c_str();
2404
2405 ASSERT_TRUE((*map)["test2"].second);
2406 ObjPtr temp100 = Obj::CreateValue(100, ObjType::None);
2407 ASSERT_TRUE(map->exist(temp100, true));
2408
2409 ObjPtr test2 = (*map)["test2"].second;
2410 ASSERT_TRUE(test2);
2411 ASSERT_TRUE(test2);
2412 ASSERT_STREQ("100", test2->toString().c_str());
2413}
2414
2415TEST(RunTest, Eq) {
2416
2417 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
2418 ObjPtr var_num = Obj::CreateValue(100.0, ObjType::None);
2419 ObjPtr var_str = Obj::CreateString(L"STRING");
2420 ObjPtr var_bool = Obj::CreateBool(true);
2421 ObjPtr var_empty = Obj::CreateNone();
2422
2423 ASSERT_EQ(var_int->m_var_type_current, ObjType::Int8) << (int) var_int->getType();
2424 ASSERT_EQ(var_num->m_var_type_current, ObjType::Float32) << (int) var_num->getType();
2425 ASSERT_EQ(var_str->m_var_type_current, ObjType::StrWide) << (int) var_str->getType();
2426 ASSERT_EQ(var_bool->m_var_type_current, ObjType::Bool) << (int) var_bool->getType();
2427 ASSERT_EQ(var_empty->m_var_type_current, ObjType::None) << (int) var_empty->getType();
2428 ASSERT_TRUE(var_empty->empty()) << (int) var_empty->getType();
2429 ASSERT_FALSE(var_int->empty()) << (int) var_int->getType();
2430
2431
2432 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100, ObjType::None)));
2433 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(111, ObjType::None)));
2434
2435 ASSERT_TRUE(var_num->op_equal(Obj::CreateValue(100.0, ObjType::None)));
2436 ASSERT_FALSE(var_num->op_equal(Obj::CreateValue(100.0001, ObjType::None)));
2437 ASSERT_TRUE(var_num->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
2438 ASSERT_FALSE(var_num->op_accurate(Obj::CreateValue(100.0001, ObjType::None)));
2439
2440 ASSERT_TRUE(var_int->op_equal(Obj::CreateValue(100.0, ObjType::None)));
2441 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
2442 ASSERT_FALSE(var_int->op_equal(Obj::CreateValue(100.1, ObjType::None)));
2443 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(100.1, ObjType::None)));
2444
2445
2446 ObjPtr var_int2 = Obj::CreateValue(101, ObjType::None);
2447 ObjPtr var_num2 = Obj::CreateValue(100.1, ObjType::None);
2448
2449
2450 ASSERT_TRUE(var_int->op_accurate(var_int));
2451 ASSERT_FALSE(var_int->op_accurate(var_int2));
2452
2453 ASSERT_TRUE(var_num->op_accurate(var_num));
2454 ASSERT_FALSE(var_num->op_accurate(var_num2));
2455
2456 ASSERT_TRUE(var_int->op_equal(var_num));
2457
2458 ASSERT_FALSE(var_int->op_equal(var_num2));
2459 ASSERT_FALSE(var_num2->op_equal(var_int));
2460
2461 ObjPtr var_bool2 = Obj::CreateBool(false);
2462
2463 ASSERT_TRUE(var_bool->op_accurate(var_bool));
2464 ASSERT_FALSE(var_bool->op_accurate(var_bool2));
2465
2466 ObjPtr var_str2 = Obj::CreateString("STRING2");
2467
2468 ASSERT_TRUE(var_str->op_accurate(var_str));
2469 ASSERT_TRUE(var_str->op_accurate(Obj::CreateString("STRING")));
2470 ASSERT_FALSE(var_str->op_accurate(var_str2));
2471
2472
2473 ObjPtr var_empty2 = Obj::CreateNone();
2474
2475 ASSERT_TRUE(var_empty->op_accurate(var_empty));
2476 ASSERT_TRUE(var_empty->op_accurate(var_empty2));
2477}
2478
2479TEST(RunTest, Ops) {
2480
2481 ObjPtr var_zero = Obj::CreateValue(0, ObjType::None);
2482 ASSERT_TRUE(var_zero->is_bool_type());
2483 ASSERT_TRUE(var_zero->is_arithmetic_type());
2484 ASSERT_EQ(ObjType::Bool, var_zero->m_var_type_current);
2485
2486 ObjPtr var_bool = Obj::CreateBool(true);
2487 ASSERT_TRUE(var_bool->is_bool_type());
2488 ASSERT_TRUE(var_bool->is_arithmetic_type());
2489 ASSERT_EQ(ObjType::Bool, var_bool->m_var_type_current);
2490
2491 ObjPtr var_char = Obj::CreateValue(100);
2492 ASSERT_TRUE(var_char->is_arithmetic_type());
2493 ASSERT_EQ(ObjType::Int8, var_char->m_var_type_current);
2494
2495 ObjPtr var_int = Obj::CreateValue(100000);
2496 ASSERT_TRUE(var_int->is_arithmetic_type());
2497 ASSERT_EQ(ObjType::Int32, var_int->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2498
2499 ObjPtr var_float = Obj::CreateValue(1.0);
2500 ASSERT_TRUE(var_float->is_arithmetic_type());
2501 ASSERT_EQ(ObjType::Float32, var_float->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2502
2503 ObjPtr var_tensor = Obj::CreateRange(0, 10)->toType(ObjType::Int32);
2504 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2505 ASSERT_EQ(ObjType::Int32, var_tensor->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2506
2507 var_tensor->operator*=(var_bool);
2508 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2509 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2510
2511 var_tensor->operator*=(var_int);
2512 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2513 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2514
2515 var_tensor->operator*=(var_float);
2516 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2517 EXPECT_EQ(ObjType::Float32, var_tensor->m_var_type_current) << newlang::toString(var_char->m_var_type_current);
2518}
2519
2520TEST(RunTest, Exist) {
2521
2522 Obj var_array(ObjType::Dictionary);
2523
2524 var_array.push_back(Obj::CreateString("item1"));
2525 var_array.push_back(Obj::CreateString("item2"));
2526
2527 ObjPtr item = Obj::CreateString("item1");
2528 ASSERT_TRUE(var_array.exist(item, true));
2529 item->SetValue_("item2");
2530 ASSERT_TRUE(var_array.exist(item, true));
2531 item->SetValue_("item");
2532 ASSERT_FALSE(var_array.exist(item, true));
2533
2534
2535 Obj var_map(ObjType::Dictionary);
2536
2537 var_map.push_back(Obj::CreateString("MAP_VALUE1"), "map1");
2538 var_map.push_back(Obj::CreateString("MAP_VALUE2"), "map2");
2539
2540 ASSERT_TRUE(var_map[std::string("map1")].second);
2541 ASSERT_TRUE(var_map["map2"].second);
2542 ASSERT_EQ(var_map.find("map"), var_map.end());
2543
2544}
2545
2546TEST(RunTest, Intersec) {
2547
2548 Obj var_array(ObjType::Dictionary);
2549 Obj var_array2(ObjType::Dictionary);
2550
2551 var_array.push_back(Obj::CreateString("item1"));
2552 var_array.push_back(Obj::CreateString("item2"));
2553
2554 ObjPtr result = var_array.op_bit_and(var_array2, true);
2555 ASSERT_TRUE(result->empty());
2556
2557 var_array2.push_back(Obj::CreateString("item3"));
2558
2559 result = var_array.op_bit_and(var_array2, true);
2560 ASSERT_TRUE(result->empty());
2561
2562 var_array2.push_back(Obj::CreateString("item1"));
2563 result = var_array.op_bit_and(var_array2, true);
2564 ASSERT_FALSE(result->empty());
2565 ASSERT_EQ(1, result->size());
2566
2567 var_array2.push_back(Obj::CreateString("item2"));
2568 result = var_array.op_bit_and(var_array2, true);
2569 ASSERT_FALSE(result->empty());
2570 ASSERT_EQ(2, result->size());
2571 //
2572 // result = Op:intersec(var_array, var_array2);
2573 // ASSERT_TRUE(Var::isEmpty(result));
2574 //
2575 //
2576 // ASSERT_TRUE(var_array.Exist(std::string("item1")));
2577 //
2578 // ASSERT_TRUE(var_array.Exist(std::string("item1")));
2579 // ASSERT_TRUE(var_array.Exist(std::string("item2")));
2580 // ASSERT_FALSE(var_array.Exist(std::string("item")));
2581 //
2582 //
2583 // Var var_map(Var::Type::MAP);
2584 //
2585 // var_map.Set("map1", "MAP1");
2586 // var_map.Set("map2", "MAP2");
2587 //
2588 // ASSERT_TRUE(var_map.Exist(std::string("map1")));
2589 // ASSERT_TRUE(var_map.Exist(std::string("map2")));
2590 // ASSERT_FALSE(var_map.Exist(std::string("map")));
2591
2592
2593
2594
2595 // Var var_object(Var::Type::OBJECT);
2596 // Var var_list(Var::Type::LIST);
2597 //
2598 // var_list.Set("map1", "MAP1");
2599 // var_map.Set("map2", "MAP2");
2600 //
2601 // ASSERT_TRUE(var_map.Exist("map1"));
2602 // ASSERT_TRUE(var_map.Exist("map2"));
2603 // ASSERT_FALSE(var_map.Exist("map"));
2604}
2605
2606TEST(RunTest, Print) {
2607
2608 RuntimePtr rt = RunTime::Init();
2609 ASSERT_TRUE(rt);
2610
2611 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
2612 ObjPtr var_num = Obj::CreateValue(100.123, ObjType::None);
2613 ObjPtr var_str = Obj::CreateString(L"STRCHAR");
2614 ObjPtr var_strbyte = Obj::CreateString("STRBYTE");
2615 ObjPtr var_bool = Obj::CreateBool(true);
2616 ObjPtr var_empty = Obj::CreateNone();
2617
2618 ASSERT_STREQ("100", var_int->toString().c_str()) << var_int;
2619 ASSERT_STREQ("100.123", var_num->toString().c_str()) << var_num;
2620 ASSERT_STREQ("\"STRCHAR\"", var_str->toString().c_str()) << var_str;
2621 ASSERT_STREQ("'STRBYTE'", var_strbyte->toString().c_str()) << var_strbyte;
2622 ASSERT_STREQ("1", var_bool->toString().c_str()) << var_bool;
2623 ASSERT_STREQ("_", var_empty->toString().c_str()) << var_empty;
2624
2625 ObjPtr var_dict = Obj::CreateType(ObjType::Dictionary);
2626
2627 ASSERT_STREQ("(,)", var_dict->toString().c_str()) << var_dict;
2628
2629 var_dict->m_var_name = "dict";
2630 ASSERT_STREQ("dict=(,)", var_dict->toString().c_str()) << var_dict;
2631
2632 var_dict->push_back(Obj::CreateString(L"item1"));
2633 ASSERT_STREQ("dict=(\"item1\",)", var_dict->toString().c_str()) << var_dict;
2634 var_dict->push_back(var_int);
2635 var_dict->push_back(var_bool);
2636 ASSERT_STREQ("dict=(\"item1\", 100, 1,)", var_dict->toString().c_str()) << var_dict;
2637
2638
2639 ObjPtr var_array = Obj::CreateDict(); //CreateTensor({1});
2640
2641 ASSERT_STREQ("(,)", var_array->toString().c_str()) << var_array;
2642
2643 var_array->m_var_name = "array";
2644 ASSERT_STREQ("array=(,)", var_array->toString().c_str()) << var_array;
2645
2646 var_array->push_back(Obj::CreateString("item1"));
2647 ASSERT_STREQ("array=('item1',)", var_array->toString().c_str()) << var_array;
2648 ASSERT_NO_THROW(var_array->push_back(var_int));
2649 ASSERT_NO_THROW(var_array->push_back(var_bool));
2650 ASSERT_STREQ("array=('item1', 100, 1,)", var_array->toString().c_str()) << var_array;
2651
2652}
2653
2654TEST(RunTest, CreateFromInteger) {
2655
2656 RuntimePtr rt = RunTime::Init();
2657
2658 ObjPtr var = jit->Run("123");
2659 ASSERT_TRUE(var);
2660 ASSERT_EQ(ObjType::Int8, var->getType()) << toString(var->getType());
2661 ASSERT_EQ(123, var->GetValueAsInteger());
2662
2663 ObjPtr var2 = jit->Run("123");
2664 ASSERT_TRUE(var2);
2665 ASSERT_EQ(ObjType::Int8, var2->getType()) << toString(var2->getType());
2666 ASSERT_EQ(123, var2->GetValueAsInteger());
2667
2668 var = jit->Run("-123");
2669 ASSERT_TRUE(var);
2670 ASSERT_EQ(ObjType::Int8, var->getType()) << toString(var->getType());
2671 ASSERT_EQ(-123, var->GetValueAsInteger());
2672
2673 var2 = jit->Run("-123");
2674 ASSERT_TRUE(var2);
2675 ASSERT_EQ(ObjType::Int8, var2->getType()) << toString(var2->getType());
2676 ASSERT_EQ(-123, var2->GetValueAsInteger());
2677}
2678
2679TEST(RunTest, CreateFromNumber) {
2680
2681 RuntimePtr rt = RunTime::Init();
2682
2683 ObjPtr var = jit->Run("123.123");
2684 ASSERT_TRUE(var);
2685 ASSERT_EQ(ObjType::Float32, var->getType());
2686 ASSERT_DOUBLE_EQ(123.123, var->GetValueAsNumber());
2687
2688 ObjPtr var2 = jit->Run("123.123");
2689 ASSERT_TRUE(var2);
2690 ASSERT_EQ(ObjType::Float32, var2->getType());
2691 ASSERT_DOUBLE_EQ(123.123, var2->GetValueAsNumber());
2692
2693 var = jit->Run("-123.123");
2694 ASSERT_TRUE(var);
2695 ASSERT_EQ(ObjType::Float64, var->getType());
2696 ASSERT_DOUBLE_EQ(-123.123, var->GetValueAsNumber());
2697
2698 var2 = jit->Run("-123.123E+40");
2699 ASSERT_TRUE(var2);
2700 ASSERT_EQ(ObjType::Float64, var2->getType());
2701 ASSERT_DOUBLE_EQ(-123.123E+40, var2->GetValueAsNumber());
2702}
2703
2704TEST(RunTest, CreateFromString) {
2705
2706 RuntimePtr rt = RunTime::Init();
2707
2708 ObjPtr var = jit->Run("\"123.123\"");
2709 ASSERT_TRUE(var);
2710 ASSERT_EQ(ObjType::StrWide, var->getType());
2711 ASSERT_STREQ("123.123", var->GetValueAsString().c_str());
2712
2713 ObjPtr var2 = jit->Run("\"123.123\"");
2714 ASSERT_TRUE(var2);
2715 ASSERT_EQ(ObjType::StrWide, var2->getType());
2716 ASSERT_STREQ("123.123", var2->GetValueAsString().c_str());
2717
2718 var = jit->Run("'строка'");
2719 ASSERT_TRUE(var);
2720 ASSERT_EQ(ObjType::StrChar, var->getType());
2721 ASSERT_STREQ("строка", var->GetValueAsString().c_str());
2722
2723 var2 = jit->Run("'строка'");
2724 ASSERT_TRUE(var2);
2725 ASSERT_EQ(ObjType::StrChar, var2->getType());
2726 ASSERT_STREQ("строка", var2->GetValueAsString().c_str());
2727}
2728
2729TEST(RunTest, CreateFromRational) {
2730
2731 RuntimePtr rt = RunTime::Init();
2732
2733 ObjPtr var = jit->Run("123\\1");
2734 ASSERT_TRUE(var);
2735 ASSERT_EQ(ObjType::Rational, var->getType()) << toString(var->getType());
2736 ASSERT_EQ(123, var->GetValueAsInteger());
2737 ASSERT_DOUBLE_EQ(123.0, var->GetValueAsNumber());
2738
2739 ObjPtr var2 = jit->Run("123\\1");
2740 ASSERT_TRUE(var2);
2741 ASSERT_EQ(ObjType::Rational, var2->getType()) << toString(var2->getType());
2742 ASSERT_EQ(123, var2->GetValueAsInteger());
2743 ASSERT_DOUBLE_EQ(123, var2->GetValueAsNumber());
2744
2745 var = jit->Run("-123\\1");
2746 ASSERT_TRUE(var);
2747 ASSERT_EQ(ObjType::Rational, var->getType()) << toString(var->getType());
2748 ASSERT_EQ(-123, var->GetValueAsInteger());
2749 ASSERT_DOUBLE_EQ(-123.0, var->GetValueAsNumber());
2750
2751 var2 = jit->Run("-123\\1");
2752 ASSERT_TRUE(var2);
2753 ASSERT_EQ(ObjType::Rational, var2->getType()) << toString(var2->getType());
2754 ASSERT_EQ(-123, var2->GetValueAsInteger());
2755 ASSERT_DOUBLE_EQ(-123, var2->GetValueAsNumber());
2756}
2757
2758//TEST(Args, All) {
2759// Context ctx(RunTime::Init());
2760// Parser p1;
2761//
2762// ASSERT_TRUE(p1.Parse("test()"));
2763// Obj local;
2764// Obj proto1(&ctx, p1.GetAst(), false, &local); // Функция с принимаемыми аргументами (нет аргументов)
2765// ASSERT_EQ(0, proto1.size());
2766// // ASSERT_FALSE(proto1.m_is_ellipsis);
2767//
2768//
2769// ObjPtr arg_999 = Obj::CreateDict(Obj::Arg(Obj::CreateValue(999, ObjType::None)));
2770// EXPECT_EQ(ObjType::Int16, (*arg_999)[0].second->getType()) << torch::toString(toTorchType((*arg_999)[0].second->getType()));
2771//
2772// ObjPtr arg_empty_named = Obj::CreateDict(Obj::Arg());
2773// ASSERT_EQ(ObjType::None, (*arg_empty_named)[0].second->getType());
2774//
2775// ObjPtr arg_123_named = Obj::CreateDict(Obj::Arg(123, "named"));
2776// EXPECT_EQ(ObjType::Int8, (*arg_123_named)[0].second->getType()) << torch::toString(toTorchType((*arg_123_named)[0].second->getType()));
2777//
2778// ObjPtr arg_999_123_named = Obj::CreateDict();
2779// ASSERT_EQ(0, arg_999_123_named->size());
2780// *arg_999_123_named += arg_empty_named;
2781// ASSERT_EQ(1, arg_999_123_named->size());
2782// *arg_999_123_named += arg_123_named;
2783// ASSERT_EQ(2, arg_999_123_named->size());
2784//
2785// ASSERT_ANY_THROW(proto1.ConvertToArgs(arg_999.get(), true, nullptr)); // Прототип не принимает позиционных аргументов
2786//
2787// ASSERT_ANY_THROW(proto1.ConvertToArgs(arg_empty_named.get(), true, nullptr)); // Прототип не принимает именованных аргументов
2788//
2789//
2790// TermPtr proto_term = Parser::ParseString("test(arg1)", nullptr, nullptr);
2791// ASSERT_EQ(1, proto_term->size()) << proto_term->toString();
2792//
2793// Parser p2;
2794// ASSERT_TRUE(p2.Parse("test(arg1)"));
2795// ASSERT_EQ(1, p2.GetAst()->size()) << p2.GetAst()->toString();
2796//
2797// const Obj proto2(&ctx, p2.GetAst(), false, &local);
2798// ASSERT_EQ(1, proto2.size()) << proto2.toString();
2799// // ASSERT_FALSE(proto2.m_is_ellipsis);
2800// ASSERT_STREQ("arg1", proto2.name(0).c_str());
2801// ASSERT_EQ(nullptr, proto2.at(0).second);
2802//
2803// ObjPtr o_arg_999 = proto2.ConvertToArgs(arg_999.get(), true, nullptr);
2804// ASSERT_TRUE((*o_arg_999)[0].second);
2805// ASSERT_STREQ("999", (*o_arg_999)[0].second->toString().c_str());
2806//
2807// // proto2[0].reset(); // Иначе типы гурментов буду отличаться
2808// ObjPtr o_arg_empty_named = proto2.ConvertToArgs(arg_empty_named.get(), false, nullptr);
2809// ASSERT_TRUE((*o_arg_empty_named)[0].second);
2810// ASSERT_STREQ("_", (*o_arg_empty_named)[0].second->toString().c_str());
2811//
2812// ASSERT_ANY_THROW(proto2.ConvertToArgs(arg_123_named.get(), true, nullptr)); // Имя аругмента отличается
2813//
2814//
2815// // Нормальный вызов
2816// Parser p3;
2817// ASSERT_TRUE(p3.Parse("test(empty=_, ...) := {}"));
2818// const Obj proto3(&ctx, p3.GetAst()->Left(), false, &local);
2819// ASSERT_EQ(2, proto3.size());
2820// // ASSERT_TRUE(proto3.m_is_ellipsis);
2821// ASSERT_STREQ("empty", proto3.name(0).c_str());
2822// ASSERT_TRUE(proto3.at(0).second);
2823// ASSERT_EQ(ObjType::None, proto3.at(0).second->getType());
2824// ASSERT_STREQ("...", proto3.name(1).c_str());
2825// ASSERT_FALSE(proto3.at(1).second);
2826//
2827// ObjPtr proto3_arg = proto3.ConvertToArgs(arg_999.get(), true, nullptr);
2828// ASSERT_EQ(1, proto3_arg->size());
2829// ASSERT_TRUE((*proto3_arg)[0].second);
2830// ASSERT_STREQ("999", (*proto3_arg)[0].second->toString().c_str());
2831// ASSERT_STREQ("empty", proto3_arg->name(0).c_str());
2832//
2833// // Дополнительный аргумент
2834// ObjPtr arg_extra = Obj::CreateDict(Obj::Arg(Obj::CreateValue(999, ObjType::None)), Obj::Arg(123, "named"));
2835//
2836// ASSERT_EQ(2, arg_extra->size());
2837// EXPECT_EQ(ObjType::Int16, (*arg_extra)[0].second->getType()) << torch::toString(toTorchType((*arg_extra)[0].second->getType()));
2838// EXPECT_EQ(ObjType::Int8, (*arg_extra)[1].second->getType()) << torch::toString(toTorchType((*arg_extra)[1].second->getType()));
2839//
2840//
2841// ObjPtr proto3_extra = proto3.ConvertToArgs(arg_extra.get(), true, nullptr);
2842// ASSERT_EQ(2, proto3_extra->size());
2843// ASSERT_STREQ("999", (*proto3_extra)[0].second->toString().c_str());
2844// ASSERT_STREQ("empty", proto3_extra->name(0).c_str());
2845// ASSERT_STREQ("123", (*proto3_extra)[1].second->toString().c_str());
2846// ASSERT_STREQ("named", proto3_extra->name(1).c_str());
2847//
2848//
2849// // Аргумент по умолчанию
2850// Parser p4;
2851// ASSERT_TRUE(p4.Parse("test(num=123) := { }"));
2852// Obj proto123(&ctx, p4.GetAst()->Left(), false, &local);
2853// ASSERT_EQ(1, proto123.size());
2854// // ASSERT_FALSE(proto123.m_is_ellipsis);
2855// ASSERT_STREQ("num", proto123.name(0).c_str());
2856// ASSERT_TRUE(proto123[0].second);
2857// ASSERT_STREQ("123", proto123[0].second->toString().c_str());
2858//
2859//
2860// // Изменен порядок
2861// Parser p5;
2862// ASSERT_TRUE(p5.Parse("test(arg1, str=\"string\") := {}"));
2863// Obj proto_str(&ctx, p5.GetAst()->Left(), false, &local);
2864// ASSERT_EQ(2, proto_str.size());
2865// // ASSERT_FALSE(proto_str.m_is_ellipsis);
2866// ASSERT_STREQ("arg1", proto_str.at(0).first.c_str());
2867// ASSERT_EQ(nullptr, proto_str[0].second);
2868//
2869// ObjPtr arg_str = Obj::CreateDict(Obj::Arg(L"СТРОКА", "str"), Obj::Arg(555, "arg1"));
2870//
2871// ObjPtr proto_str_arg = proto_str.ConvertToArgs(arg_str.get(), true, nullptr);
2872// ASSERT_STREQ("arg1", proto_str_arg->at(0).first.c_str());
2873// ASSERT_TRUE(proto_str_arg->at(0).second);
2874// ASSERT_STREQ("555", (*proto_str_arg)[0].second->toString().c_str());
2875// ASSERT_STREQ("str", proto_str_arg->at(1).first.c_str());
2876// ASSERT_TRUE((*proto_str_arg)[1].second);
2877// ASSERT_STREQ("\"СТРОКА\"", (*proto_str_arg)[1].second->toString().c_str());
2878//
2879//
2880// Parser p6;
2881// ASSERT_TRUE(p6.Parse("test(arg1, ...) := {}"));
2882// Obj proto_any(&ctx, p6.GetAst()->Left(), false, &local);
2883// // ASSERT_TRUE(proto_any.m_is_ellipsis);
2884// ASSERT_EQ(2, proto_any.size());
2885// ASSERT_STREQ("arg1", proto_any.at(0).first.c_str());
2886// ASSERT_EQ(nullptr, proto_any.at(0).second);
2887//
2888// ObjPtr any = proto_any.ConvertToArgs(arg_str.get(), true, nullptr);
2889// ASSERT_EQ(2, any->size());
2890// ASSERT_STREQ("arg1", any->at(0).first.c_str());
2891// ASSERT_TRUE(any->at(0).second);
2892// ASSERT_STREQ("555", (*any)[0].second->toString().c_str());
2893// ASSERT_STREQ("str", any->at(1).first.c_str());
2894// ASSERT_TRUE(any->at(1).second);
2895// ASSERT_STREQ("\"СТРОКА\"", (*any)[1].second->toString().c_str());
2896//
2897//
2898// Parser p7;
2899// ASSERT_TRUE(p7.Parse("func(arg) := {}"));
2900// Obj proto_func(&ctx, p7.GetAst()->Left(), false, &local);
2901// // ASSERT_TRUE(proto_any.m_is_ellipsis);
2902// ASSERT_EQ(1, proto_func.size());
2903// ASSERT_STREQ("arg", proto_func.at(0).first.c_str());
2904// ASSERT_EQ(nullptr, proto_func.at(0).second);
2905//
2906// ObjPtr arg_str2 = Obj::CreateDict(Obj::Arg("STRING"));
2907//
2908// proto_func.ConvertToArgs_(arg_str2.get(), true, nullptr);
2909// ASSERT_EQ(1, proto_func.size());
2910// ASSERT_STREQ("arg", proto_func.at(0).first.c_str());
2911// ASSERT_TRUE(proto_func.at(0).second);
2912// ASSERT_STREQ("'STRING'", proto_func[0].second->toString().c_str());
2913// ASSERT_EQ(ObjType::StrChar, proto_func[0].second->getType());
2914//
2915// //
2916// Parser p8;
2917// ASSERT_TRUE(p8.Parse("min(arg, ...) := {}"));
2918// Obj min_proto(&ctx, p8.GetAst()->Left(), false, &local);
2919// ObjPtr min_args = Obj::CreateDict(Obj::Arg(200), Obj::Arg(100), Obj::Arg(300));
2920// ObjPtr min_arg = min_proto.ConvertToArgs(min_args.get(), true, nullptr);
2921//
2922// ASSERT_EQ(3, min_arg->size());
2923// ASSERT_STREQ("200", (*min_arg)[0].second->toString().c_str());
2924// ASSERT_STREQ("100", (*min_arg)[1].second->toString().c_str());
2925// ASSERT_STREQ("300", (*min_arg)[2].second->toString().c_str());
2926//
2927// Parser p9;
2928// ASSERT_TRUE(p9.Parse("min(200, 100, 300)"));
2929// Obj args_term(&ctx, p9.GetAst(), true, &local);
2930// ASSERT_STREQ("200", args_term[0].second->toString().c_str());
2931// ASSERT_STREQ("100", args_term[1].second->toString().c_str());
2932// ASSERT_STREQ("300", args_term[2].second->toString().c_str());
2933//}
2934
2935TEST(Types, FromLimit) {
2936
2937 std::multimap<int64_t, ObjType> IntTypes = {
2938 {0, ObjType::Bool},
2939 {1, ObjType::Bool},
2940 {2, ObjType::Int8},
2941 {127, ObjType::Int8},
2942 // {255, ObjType::Int8},
2943 {256, ObjType::Int16},
2944 {-1, ObjType::Int8},
2945 {-200, ObjType::Int16},
2946 {66000, ObjType::Int32},
2947 {-33000, ObjType::Int32},
2948 {5000000000, ObjType::Int64},
2949 };
2950
2951 for (auto elem : IntTypes) {
2952 ASSERT_EQ(elem.second, typeFromLimit(elem.first)) << elem.first << " " << toString(elem.second);
2953 }
2954
2955 ASSERT_EQ(ObjType::Float32, typeFromLimit(1.0));
2956 ASSERT_EQ(ObjType::Float64, typeFromLimit(0.0)); //@todo Fix???????
2957 ASSERT_EQ(ObjType::Float64, typeFromLimit(1E+40));
2958
2959}
2960
2961TEST(RunTest, Tensor) {
2962
2963 RuntimePtr rt = RunTime::Init();
2964
2965 std::string from_str = "русские буквы для ПРОВЕРКИ КОНВЕРТАЦИИ символов";
2966 std::wstring to_str = utf8_decode(from_str);
2967 std::string conv_str = utf8_encode(to_str);
2968
2969 ASSERT_STREQ(from_str.c_str(), conv_str.c_str());
2970
2971 // Байтовые строки
2972 ObjPtr str = Obj::CreateString("test");
2973
2974 ASSERT_STREQ("test", str->m_value.c_str());
2975
2976 torch::Tensor tstr_t;
2977
2978 ConvertStringToTensor(str->m_value, tstr_t, ObjType::Int8);
2979
2980 ASSERT_TRUE(tstr_t.defined());
2981 ASSERT_EQ(tstr_t.index({0}).item<int>(), 't');
2982 ASSERT_EQ(tstr_t.index({1}).item<int>(), 'e');
2983 ASSERT_EQ(tstr_t.index({2}).item<int>(), 's');
2984 ASSERT_EQ(tstr_t.index({3}).item<int>(), 't');
2985
2986
2987 torch::Tensor tensot_temp = *str->toType(ObjType::Tensor)->m_tensor;
2988 ASSERT_TRUE(tensot_temp.defined());
2989 ASSERT_EQ(tensot_temp.index({0}).item<int>(), 't');
2990 ASSERT_EQ(tensot_temp.index({1}).item<int>(), 'e');
2991 ASSERT_EQ(tensot_temp.index({2}).item<int>(), 's');
2992 ASSERT_EQ(tensot_temp.index({3}).item<int>(), 't');
2993
2994 ObjPtr t_str = CreateTensor(tensot_temp);
2995 ASSERT_EQ(t_str->m_var_type_current, ObjType::Int8) << toString(t_str->m_var_type_current);
2996 ASSERT_EQ(4, t_str->size());
2997 ASSERT_TRUE(t_str->m_tensor->defined());
2998
2999 ASSERT_EQ(t_str->m_tensor->index({0}).item<int>(), 't');
3000 ASSERT_EQ(t_str->m_tensor->index({1}).item<int>(), 'e');
3001 ASSERT_EQ(t_str->m_tensor->index({2}).item<int>(), 's');
3002 ASSERT_EQ(t_str->m_tensor->index({3}).item<int>(), 't');
3003
3004 ASSERT_EQ(t_str->index_get({0})->GetValueAsInteger(), 't');
3005 ASSERT_EQ(t_str->index_get({1})->GetValueAsInteger(), 'e');
3006 ASSERT_EQ(t_str->index_get({2})->GetValueAsInteger(), 's');
3007 ASSERT_EQ(t_str->index_get({3})->GetValueAsInteger(), 't');
3008
3009 ASSERT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(), "test") << t_str->toType(ObjType::StrWide)->GetValueAsString();
3010
3011 t_str->index_set_({1}, Obj::CreateString("E"));
3012 t_str->index_set_({2}, Obj::CreateString("S"));
3013
3014 EXPECT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(), "tESt") << t_str->toType(ObjType::StrWide)->GetValueAsString();
3015
3016 // Символьные сторки
3017 ObjPtr wstr = Obj::CreateString(L"ТЕСТ");
3018 ObjPtr t_wstr = CreateTensor(*wstr->toType(ObjType::Tensor)->m_tensor);
3019 if (sizeof (wchar_t) == 2) {
3020 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int16);
3021 } else {
3022 ASSERT_TRUE(sizeof (wchar_t) == 4);
3023 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int32);
3024 }
3025 ASSERT_EQ(4, t_wstr->size());
3026
3027 ASSERT_EQ(t_wstr->index_get({0})->GetValueAsInteger(), L'Т');
3028 ASSERT_EQ(t_wstr->index_get({1})->GetValueAsInteger(), L'Е');
3029 ASSERT_EQ(t_wstr->index_get({2})->GetValueAsInteger(), L'С');
3030 ASSERT_EQ(t_wstr->index_get({3})->GetValueAsInteger(), L'Т');
3031
3032 std::wstring test_wide = t_wstr->toType(ObjType::StrWide)->GetValueAsStringWide();
3033 EXPECT_STREQ(utf8_encode(test_wide).c_str(), "ТЕСТ");
3034
3035 std::string test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
3036 EXPECT_STREQ(test_str.c_str(), "ТЕСТ") << test_str;
3037
3038 t_wstr->index_set_({1}, Obj::CreateString(L"е"));
3039 t_wstr->index_set_({2}, Obj::CreateString(L"с"));
3040
3041 test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
3042 EXPECT_STREQ(test_str.c_str(), "ТесТ") << test_str;
3043
3044}
3045
3046TEST(RunTest, Iterator) {
3047
3048 ObjPtr dict = Obj::CreateDict();
3049
3050 dict->push_back(Obj::Arg(1, "1"));
3051 dict->push_back(Obj::Arg(2, "22"));
3052 dict->push_back(Obj::Arg(3, "333"));
3053 dict->push_back(Obj::Arg(4));
3054 dict->push_back(Obj::Arg(5, "555"));
3055
3056 ASSERT_EQ(5, dict->size());
3057
3058 auto all = std::regex("(.|\\n)*");
3059 ASSERT_TRUE(std::regex_match("1", all));
3060 ASSERT_TRUE(std::regex_match("22", all));
3061 ASSERT_TRUE(std::regex_match("333", all));
3062 ASSERT_TRUE(std::regex_match("", all));
3063 ASSERT_TRUE(std::regex_match("\n", all));
3064 ASSERT_TRUE(std::regex_match("\n\n\\n", all));
3065
3066
3067 Iterator <Obj> iter(dict);
3068
3069 ASSERT_TRUE(iter == iter.begin());
3070 ASSERT_TRUE(iter != iter.end());
3071
3072 ObjPtr copy = Obj::CreateDict();
3073 for (auto &elem : iter) {
3074
3075 copy->push_back(elem.second, elem.first);
3076 }
3077
3078 ASSERT_TRUE(iter == iter.begin());
3079 ASSERT_TRUE(iter != iter.end());
3080
3081 ASSERT_EQ(dict->size(), copy->size());
3082
3083
3084 ASSERT_TRUE(iter == iter.begin());
3085
3086 ObjPtr one = iter.read_and_next(0);
3087 ASSERT_TRUE(one);
3088 ASSERT_EQ(1, one->GetValueAsInteger());
3089
3090 ASSERT_EQ(2, (*iter).second->GetValueAsInteger());
3091 one = iter.read_and_next(0);
3092 ASSERT_TRUE(one);
3093 ASSERT_EQ(2, one->GetValueAsInteger());
3094
3095 ASSERT_EQ(3, (*iter).second->GetValueAsInteger());
3096 one = iter.read_and_next(0);
3097 ASSERT_TRUE(one);
3098 ASSERT_EQ(3, one->GetValueAsInteger());
3099
3100 ASSERT_EQ(4, (*iter).second->GetValueAsInteger());
3101 one = iter.read_and_next(0);
3102 ASSERT_TRUE(one);
3103 ASSERT_EQ(4, one->GetValueAsInteger());
3104
3105 ASSERT_EQ(5, (*iter).second->GetValueAsInteger());
3106 one = iter.read_and_next(0);
3107 ASSERT_TRUE(one);
3108 ASSERT_EQ(5, one->GetValueAsInteger());
3109
3110 one = iter.read_and_next(0);
3111 ASSERT_TRUE(one);
3112 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one << " " << toString(one->getType());
3113
3114 one = iter.read_and_next(0);
3115 ASSERT_TRUE(one);
3116 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one << " " << toString(one->getType());
3117
3118
3119
3120
3121 ASSERT_TRUE(iter == iter.end());
3122 iter.reset();
3123 ASSERT_TRUE(iter == iter.begin());
3124 ASSERT_TRUE(iter != iter.end());
3125
3126 ObjPtr dict1 = iter.read_and_next(-3);
3127 ASSERT_TRUE(dict1);
3128 ASSERT_EQ(3, dict1->size());
3129 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
3130 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
3131 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
3132
3133 ObjPtr dict2 = iter.read_and_next(-3);
3134 ASSERT_TRUE(dict2);
3135 ASSERT_EQ(3, dict2->size());
3136 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
3137 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
3138 ASSERT_EQ(ObjType::IteratorEnd, dict2->at(2).second->getType());
3139
3140 ObjPtr dict3 = iter.read_and_next(-3);
3141 ASSERT_TRUE(dict3);
3142 ASSERT_EQ(3, dict1->size());
3143 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(0).second->getType());
3144 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(1).second->getType());
3145 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(2).second->getType());
3146
3147
3148
3149 ASSERT_TRUE(iter == iter.end());
3150 iter.reset();
3151 ASSERT_TRUE(iter == iter.begin());
3152 ASSERT_TRUE(iter != iter.end());
3153
3154 dict1 = iter.read_and_next(3);
3155 ASSERT_TRUE(dict1);
3156 ASSERT_EQ(3, dict1->size());
3157 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
3158 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
3159 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
3160
3161 dict2 = iter.read_and_next(3);
3162 ASSERT_TRUE(dict2);
3163 ASSERT_EQ(2, dict2->size());
3164 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
3165 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
3166
3167 dict3 = iter.read_and_next(3);
3168 ASSERT_TRUE(dict3);
3169 ASSERT_EQ(0, dict3->size());
3170
3171
3172
3173
3174 Iterator <Obj> flt(dict, "");
3175 ObjPtr flt_res = flt.read_and_next(100);
3176 ASSERT_TRUE(flt_res);
3177 ASSERT_EQ(1, flt_res->size());
3178 ASSERT_EQ(4, flt_res->at(0).second->GetValueAsInteger());
3179
3180
3181 Iterator <Obj> flt1(dict, ".");
3182 ObjPtr flt1_res = flt1.read_and_next(100);
3183 ASSERT_TRUE(flt1_res);
3184 ASSERT_EQ(1, flt1_res->size());
3185 ASSERT_EQ(1, flt1_res->at(0).second->GetValueAsInteger());
3186
3187
3188 Iterator <Obj> flt2(dict, "..");
3189 ObjPtr flt2_res = flt2.read_and_next(100);
3190 ASSERT_TRUE(flt2_res);
3191 ASSERT_EQ(1, flt2_res->size());
3192 ASSERT_EQ(2, flt2_res->at(0).second->GetValueAsInteger());
3193
3194 Iterator <Obj> flt3(dict, "...");
3195 ObjPtr flt3_res = flt3.read_and_next(100);
3196 ASSERT_TRUE(flt3_res);
3197 ASSERT_EQ(2, flt3_res->size());
3198 ASSERT_EQ(3, flt3_res->at(0).second->GetValueAsInteger());
3199 ASSERT_EQ(5, flt3_res->at(1).second->GetValueAsInteger());
3200
3201
3202
3203 // ObjPtr iter1 = dict->MakeIterator();
3204
3205}
3206
3207TEST(RunTest, System) {
3208
3209 ASSERT_STREQ("name", ExtractName("name").c_str());
3210 ASSERT_STREQ("name", ExtractName("::name").c_str());
3211 ASSERT_STREQ("name", ExtractName("ns::name").c_str());
3212 ASSERT_STREQ("", ExtractName("\\file").c_str());
3213 ASSERT_STREQ("", ExtractName("\\\\dir.file").c_str());
3214 ASSERT_STREQ("var", ExtractName("\\dir.file::var").c_str());
3215 ASSERT_STREQ("var.field", ExtractName("\\\\dir.file::var.field").c_str());
3216
3217
3218 ASSERT_STREQ("\\file", ExtractModuleName("\\file").c_str());
3219 ASSERT_STREQ("\\\\dir.file", ExtractModuleName("\\\\dir.file").c_str());
3220 ASSERT_STREQ("\\dir.file", ExtractModuleName("\\dir.file::var").c_str());
3221 ASSERT_STREQ("\\\\dir.file", ExtractModuleName("\\\\dir.file::var.field").c_str());
3222
3223
3224 ObjPtr none = Obj::CreateNone();
3225
3226 ASSERT_TRUE(none->at("__error_field_name__").second);
3227 ASSERT_STREQ("Internal field '__error_field_name__' not exist!", none->at("__error_field_name__").second->GetValueAsString().c_str());
3228
3229 ASSERT_TRUE(none->at("__type__").second);
3230 ASSERT_STREQ(":None", none->at("__type__").second->GetValueAsString().c_str());
3231
3232 ASSERT_TRUE(none->at("__type_fixed__").second);
3233 ASSERT_STREQ(":None", none->at("__type_fixed__").second->GetValueAsString().c_str());
3234
3235 ASSERT_TRUE(none->at("__name__").second);
3236 ASSERT_STREQ("", none->at("__name__").second->GetValueAsString().c_str());
3237
3238 ASSERT_TRUE(none->at("__full_name__").second);
3239 ASSERT_STREQ("", none->at("__full_name__").second->GetValueAsString().c_str());
3240
3241 ASSERT_TRUE(none->at("__module__").second);
3242 ASSERT_STREQ("", none->at("__module__").second->GetValueAsString().c_str());
3243
3244 ASSERT_TRUE(none->at("__class__").second);
3245 ASSERT_STREQ("", none->at("__class__").second->GetValueAsString().c_str());
3246
3247 ASSERT_TRUE(none->at("__base__").second);
3248 ASSERT_STREQ("(,)", none->at("__base__").second->GetValueAsString().c_str());
3249
3250 ASSERT_TRUE(none->at("__doc__").second);
3251 ASSERT_STREQ("Help system not implemented!!!!!", none->at("__doc__").second->GetValueAsString().c_str());
3252
3253 ASSERT_TRUE(none->at("__str__").second);
3254 ASSERT_STREQ("_", none->at("__str__").second->GetValueAsString().c_str());
3255
3256 none->m_var_is_init = false;
3257 ASSERT_TRUE(none->at("__error_field_name__").second);
3258 ASSERT_STREQ(":Undefined", none->at("__error_field_name__").second->GetValueAsString().c_str());
3259
3260
3261 ObjPtr str = Obj::CreateString("str");
3262 str->m_var_name = "name";
3263
3264 ASSERT_TRUE(str->at("__type__").second);
3265 ASSERT_STREQ(":StrChar", str->at("__type__").second->GetValueAsString().c_str());
3266
3267 ASSERT_TRUE(str->at("__type_fixed__").second);
3268 ASSERT_STREQ(":String", str->at("__type_fixed__").second->GetValueAsString().c_str());
3269
3270 ASSERT_TRUE(str->at("__name__").second);
3271 ASSERT_STREQ("name", str->at("__name__").second->GetValueAsString().c_str());
3272
3273 ASSERT_TRUE(str->at("__full_name__").second);
3274 ASSERT_STREQ("name", str->at("__full_name__").second->GetValueAsString().c_str());
3275
3276 ASSERT_TRUE(str->at("__module__").second);
3277 ASSERT_STREQ("", str->at("__module__").second->GetValueAsString().c_str());
3278
3279 ASSERT_TRUE(str->at("__class__").second);
3280 ASSERT_STREQ("", str->at("__class__").second->GetValueAsString().c_str());
3281
3282 ASSERT_TRUE(str->at("__base__").second);
3283 ASSERT_STREQ("(,)", str->at("__base__").second->GetValueAsString().c_str());
3284
3285 ASSERT_TRUE(str->at("__doc__").second);
3286 ASSERT_STREQ("Help system not implemented!!!!!", str->at("__doc__").second->GetValueAsString().c_str());
3287
3288 ASSERT_TRUE(str->at("__str__").second);
3289 ASSERT_STREQ("name='str'", str->at("__str__").second->GetValueAsString().c_str());
3290
3291
3292 ObjPtr cls = Obj::CreateClass("class");
3293 cls->m_var_name = "::ns::name";
3294 cls->push_back(Obj::CreateRange(0, 10, 3), "filed");
3295
3296 ASSERT_TRUE(cls->at("__type__").second);
3297 ASSERT_STREQ(":Class", cls->at("__type__").second->GetValueAsString().c_str());
3298
3299 ASSERT_TRUE(cls->at("__type_fixed__").second);
3300 ASSERT_STREQ(":None", cls->at("__type_fixed__").second->GetValueAsString().c_str());
3301
3302 ASSERT_TRUE(cls->at("__name__").second);
3303 ASSERT_STREQ("name", cls->at("__name__").second->GetValueAsString().c_str());
3304
3305 ASSERT_TRUE(cls->at("__full_name__").second);
3306 ASSERT_STREQ("::ns::name", cls->at("__full_name__").second->GetValueAsString().c_str());
3307
3308 ASSERT_TRUE(cls->at("__module__").second);
3309 ASSERT_STREQ("", cls->at("__module__").second->GetValueAsString().c_str());
3310
3311 ASSERT_TRUE(cls->at("__class__").second);
3312 ASSERT_STREQ("class", cls->at("__class__").second->GetValueAsString().c_str());
3313
3314 ASSERT_TRUE(cls->at("__base__").second);
3315 ASSERT_STREQ("(,)", cls->at("__base__").second->GetValueAsString().c_str());
3316
3317 ASSERT_TRUE(cls->at("__doc__").second);
3318 ASSERT_STREQ("Help system not implemented!!!!!", cls->at("__doc__").second->GetValueAsString().c_str());
3319
3320 ASSERT_TRUE(cls->at("__str__").second);
3321 ASSERT_STREQ("::ns::name=class(filed=0..10..3)", cls->at("__str__").second->GetValueAsString().c_str());
3322}
3323
3324
3325
3326#endif // UNITTEST
uint8_t LogLevelType
Definition logger.h:319
virtual int64_t size() const
Definition object.h:624
virtual bool empty() const
Definition object.cpp:193
std::enable_if< std::is_same< T, bool >::value, void >::type SetValue_(bool value)
Definition object.h:1766
ObjType getType()
Definition object.h:423
Obj::const_iterator insert(Obj::const_iterator pos, const PairType &data)
Definition object.h:812
PairType & push_back(const PairType &p)
Definition object.h:784
Obj::const_iterator at_index_const(const int64_t index) const
Definition object.h:805
int result
Definition lexer.l:367
#define LOG_LEVEL_INFO
Definition logger.h:87
Definition nlc.h:59
std::wstring utf8_decode(const std::string str)
Definition variable.cpp:22
std::string ExtractName(std::string name)
Definition types.h:1223
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
std::shared_ptr< RunTime > RuntimePtr
Definition types.h:242
std::string ExtractModuleName(const std::string_view name)
Definition types.h:1188
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
Definition object.cpp:3788
const char * toString(TermID type)
Definition term.h:126
std::string utf8_encode(const std::wstring wstr)
Definition variable.cpp:10
std::string Dump(const T &iterable)
Definition logger.h:306
void ConvertStringToTensor(const std::string &from, torch::Tensor &to, ObjType type=ObjType::None)
Definition object.cpp:2151
ObjPtr CreateTensor(torch::Tensor tensor)
Definition object.cpp:52