4#include <gtest/gtest.h>
14class SystemTest :
public ::testing::Test {
19 std::vector<std::string> m_postlex;
21 Logger::FuncCallback *m_log_callback_save;
22 void *m_log_callback_arg_save;
25 static void LoggerCallback(
void *param,
Logger::LogLevelType level,
const char * str,
bool flush) {
26 SystemTest *p =
static_cast<SystemTest *
> (param);
27 fprintf(stdout,
"%s", str);
37 Logger::Instance()->SaveCallback(m_log_callback_save, m_log_callback_arg_save);
38 Logger::Instance()->SetCallback(&LoggerCallback,
this);
42 Logger::Instance()->SetCallback(m_log_callback_save, m_log_callback_arg_save);
47 ast = Parser::ParseString(str, buffer, &m_postlex, diag);
51 int Count(
TermID token_id) {
53 for (
int c = 0; c < ast->size(); c++) {
54 if ((*ast)[c].second->m_id == token_id) {
61 std::string LexOut() {
63 for (
int i = 0; i < m_postlex.size(); i++) {
145TEST_F(SystemTest, MethodExist) {
152 std::vector<Method> list;
154 list.push_back({
"getname",
nullptr});
159 std::string callname;
160 for (
auto &elem : list) {
161 callname =
"System::";
162 callname += elem.name;
168 ObjPtr arg = Obj::CreateDict();
169 arg->push_back(Obj::Arg());
170 arg->push_back(Obj::Arg(
"ls -l"));
172 ObjPtr ret = System::system(
nullptr, *arg);
174 std::cout << ret->toString().c_str();
178TEST_F(SystemTest, StaticAssert) {
183 ASSERT_TRUE(rt->m_macro);
184 ASSERT_FALSE(rt->m_macro->empty());
185 ASSERT_FALSE(rt->m_macro->find(
"static_assert") == rt->m_macro->end()) << rt->m_macro->Dump();
189 TermPtr term = rt->GetParser()->Parse(
"@static_assert(1)");
191 ASSERT_TRUE(term->getTermID() == TermID::END);
193 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(0)"));
194 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(0.0)"));
195 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(0\\1)"));
196 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert('')"));
197 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(\"\")"));
198 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert($local)"));
199 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(::global)"));
200 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(@macro)"));
202 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1)"));
203 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1.0)"));
204 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1\\1)"));
205 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(' ')"));
206 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(\" \")"));
208 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(%printf)"));
210 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(%FAIL_NATIVE_NAME)"));
211 int FAIL_NATIVE_NAME;
212 LLVMAddSymbol(
"FAIL_NATIVE_NAME", (
void *) &FAIL_NATIVE_NAME);
213 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(%FAIL_NATIVE_NAME)"));
215 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1==1)"));
216 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1.0===1.0)"));
217 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(1\\1 <= 10)"));
218 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(''=='')"));
219 ASSERT_NO_THROW(rt->GetParser()->Parse(
"@static_assert(\"str\"=='str')"));
221 ASSERT_ANY_THROW(rt->GetParser()->Parse(
"@static_assert(\"str2222\"=='str')"));
225TEST_F(SystemTest, Assert) {
228 JitPtr jit = JIT::Init(*rt);
232 ASSERT_TRUE(rt->m_assert_enable);
234 ASSERT_TRUE(rt->m_macro);
235 ASSERT_FALSE(rt->m_macro->empty());
236 ASSERT_FALSE(rt->m_macro->find(
"assert") == rt->m_macro->end()) << rt->m_macro->Dump();
237 ASSERT_FALSE(rt->m_macro->find(
"verify") == rt->m_macro->end()) << rt->m_macro->Dump();
241 ASSERT_NO_THROW(
result = jit->Run(
"1"));
243 ASSERT_STREQ(
"1",
result->toString().c_str());
245 ASSERT_NO_THROW(
result = jit->Run(
":Bool(1)"));
247 ASSERT_STREQ(
"1",
result->toString().c_str());
249 ASSERT_NO_THROW(
result = jit->Run(
"1+1"));
251 ASSERT_STREQ(
"2",
result->toString().c_str());
253 ASSERT_NO_THROW(
result = jit->Run(
":Bool(1+1)"));
255 ASSERT_STREQ(
"1",
result->toString().c_str());
258 ASSERT_NO_THROW(term = rt->GetParser()->Parse(
" :Bool(1)")) <<
Dump(*rt);
260 ASSERT_STREQ(
":Bool(1)", term->toString().c_str());
262 ASSERT_NO_THROW(term = rt->GetParser()->Parse(
":Bool(1+1)")) <<
Dump(*rt);
267 term = rt->GetParser()->Parse(
"@assert(1+1, 2, 'str')");
270 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
271 ASSERT_STREQ(
"[:Bool(1 + 1) == 0]-->{::Base::__assert_abort__(\"1+1\", 1 + 1, 2, 'str');};", term->toString().c_str());
274 ASSERT_TRUE(analisys.Analyze(term, term)) <<
Dump(*rt);
277 ASSERT_NO_THROW(
result = jit->Run(term)) <<
Dump(*rt);
280 term = rt->GetParser()->Parse(
"@verify(1)");
283 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
284 ASSERT_STREQ(
"[:Bool(1) == 0]-->{::Base::__assert_abort__(\"1\", 1);};", term->toString().c_str());
286 ASSERT_NO_THROW(
result = jit->Run(term->toString())) <<
Dump(*rt);
288 term = rt->GetParser()->Parse(
"@verify(0, 3+4, '555')");
290 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
291 ASSERT_STREQ(
"[:Bool(0) == 0]-->{::Base::__assert_abort__(\"0\", 0, 3 + 4, '555');};", term->toString().c_str());
293 ASSERT_ANY_THROW(
result = jit->Run(term)) <<
Dump(*rt);
297 rt = RunTime::Init({
"--nlc-no-assert"});
298 ASSERT_FALSE(rt->m_assert_enable);
300 ASSERT_TRUE(rt->m_macro);
301 ASSERT_FALSE(rt->m_macro->empty());
302 ASSERT_FALSE(rt->m_macro->find(
"assert") == rt->m_macro->end()) << rt->m_macro->Dump();
303 ASSERT_FALSE(rt->m_macro->find(
"verify") == rt->m_macro->end()) << rt->m_macro->Dump();
308 term = rt->GetParser()->Parse(
"@assert(1+1, 2, 'str'); 33+44; 55");
311 ASSERT_TRUE(term->getTermID() == TermID::BLOCK) <<
toString(term->getTermID()) <<
" " << term->toString();
312 ASSERT_STREQ(
"{_; 33 + 44; 55;}", term->toString().c_str());
314 ASSERT_NO_THROW(
result = jit->Run(term->toString())) <<
Dump(*rt);
317 term = rt->GetParser()->Parse(
"@verify(1+1, 'message'); 33+44");
320 ASSERT_TRUE(term->getTermID() == TermID::BLOCK) << term->toString();
321 ASSERT_STREQ(
"{1 + 1; 33 + 44;}", term->toString().c_str());
323 ASSERT_NO_THROW(
result = jit->Run(term->toString()));
325 term = rt->GetParser()->Parse(
"@verify(0+0)");
328 ASSERT_TRUE(term->getTermID() == TermID::OP_MATH) << term->toString();
329 ASSERT_STREQ(
"0 + 0", term->toString().c_str());
331 ASSERT_NO_THROW(
result = jit->Run(term->toString()));
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
std::shared_ptr< Macro > MacroPtr
std::shared_ptr< Diag > DiagPtr
const char * toString(TermID type)
std::string & trim(std::string &s, const char *t=ws)
std::string Dump(const T &iterable)