|
|
|
/**
|
|
|
|
* Copyright 2020 Huawei Technologies Co., Ltd
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
#include <iostream>
|
|
|
|
#include <string>
|
|
|
|
#include "common/common_test.h"
|
|
|
|
#include "common/py_func_graph_fetcher.h"
|
|
|
|
|
|
|
|
#include "utils/log_adapter.h"
|
|
|
|
#include "pipeline/jit/parse/parse.h"
|
|
|
|
#include "debug/draw.h"
|
|
|
|
|
|
|
|
namespace mindspore {
|
|
|
|
namespace parse {
|
|
|
|
class TestParser : public UT::Common {
|
|
|
|
public:
|
|
|
|
TestParser() {}
|
|
|
|
virtual void SetUp();
|
|
|
|
virtual void TearDown();
|
|
|
|
|
|
|
|
py::function fn;
|
|
|
|
|
|
|
|
py::function GetPythonFunction(std::string function);
|
|
|
|
};
|
|
|
|
|
|
|
|
void TestParser::SetUp() { UT::InitPythonPath(); }
|
|
|
|
|
|
|
|
void TestParser::TearDown() {}
|
|
|
|
|
|
|
|
py::function TestParser::GetPythonFunction(std::string function) {
|
|
|
|
// init resource
|
|
|
|
try {
|
|
|
|
fn = python_adapter::GetPyFn("gtest_input.pipeline.parse.parser_test", function.c_str());
|
|
|
|
return fn;
|
|
|
|
} catch (...) {
|
|
|
|
MS_LOG(ERROR) << "get fn failure!!!";
|
|
|
|
}
|
|
|
|
return py::none();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseApi) {
|
|
|
|
// Test null fn
|
|
|
|
py::function fn_null;
|
|
|
|
FuncGraphPtr func_graph = ParsePythonCode(fn_null);
|
|
|
|
ASSERT_TRUE(nullptr == func_graph);
|
|
|
|
|
|
|
|
// Test parse api
|
|
|
|
GetPythonFunction("test_f");
|
|
|
|
func_graph = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != func_graph);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseAst) {
|
|
|
|
GetPythonFunction("test_f");
|
|
|
|
|
|
|
|
ParseAst ast = ParseAst(fn);
|
|
|
|
bool succ = ast.InitParseAstInfo();
|
|
|
|
ASSERT_TRUE(succ = true);
|
|
|
|
|
|
|
|
// get FunctionDef node
|
|
|
|
py::object node = ast.GetAstNode();
|
|
|
|
|
|
|
|
// check arg
|
|
|
|
std::string fun_args[] = {"x", "y"};
|
|
|
|
std::string fun_name = "test_f";
|
|
|
|
py::list args = ast.GetArgs(node);
|
|
|
|
for (std::size_t i = 0; i < args.size(); i++) {
|
|
|
|
py::str pyArg = args[i].attr("arg");
|
|
|
|
std::string arg = pyArg;
|
|
|
|
ASSERT_STREQ(arg.c_str(), fun_args[i].c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
// check function name
|
|
|
|
// get function name
|
|
|
|
py::str name = python_adapter::GetPyObjAttr(node, "name");
|
|
|
|
std::string function_name = name;
|
|
|
|
ASSERT_STREQ(function_name.c_str(), fun_name.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphSuccess) {
|
|
|
|
GetPythonFunction("test_f");
|
|
|
|
// parse fn to graph
|
|
|
|
FuncGraphPtr func_graph = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != func_graph);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphIf) {
|
|
|
|
GetPythonFunction("test_if");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphIfExp) {
|
|
|
|
GetPythonFunction("test_ifexp");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphIfNested) {
|
|
|
|
GetPythonFunction("test_if_nested");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseWhile) {
|
|
|
|
GetPythonFunction("test_while");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphNum) {
|
|
|
|
FuncGraphPtr ret_val;
|
|
|
|
GetPythonFunction("testDoNum");
|
|
|
|
ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphStr) {
|
|
|
|
FuncGraphPtr ret_val;
|
|
|
|
GetPythonFunction("testDoStr");
|
|
|
|
ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphNamedConst) {
|
|
|
|
FuncGraphPtr ret_val;
|
|
|
|
GetPythonFunction("testDoNamedConstTrue");
|
|
|
|
ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
GetPythonFunction("testDoNamedConstFalse");
|
|
|
|
ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
GetPythonFunction("testDoNamedConstNone");
|
|
|
|
ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphForStatement) {
|
|
|
|
GetPythonFunction("test_for");
|
|
|
|
|
|
|
|
FuncGraphPtr func_graph = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != func_graph);
|
|
|
|
|
|
|
|
// save the func_graph to manager
|
|
|
|
std::shared_ptr<FuncGraphManager> manager = Manage(func_graph);
|
|
|
|
|
|
|
|
// call resolve
|
|
|
|
bool ret_ = ResolveAll(manager);
|
|
|
|
|
|
|
|
ASSERT_TRUE(ret_);
|
|
|
|
|
|
|
|
// draw graph
|
|
|
|
int i = 0;
|
|
|
|
for (auto tmp : manager->func_graphs()) {
|
|
|
|
std::string name = "ut_parser_for_loop_" + std::to_string(i) + ".dot";
|
|
|
|
draw::Draw(name, tmp);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprLt) {
|
|
|
|
GetPythonFunction("test_compare_lt");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprGt) {
|
|
|
|
GetPythonFunction("test_compare_gt");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprLe) {
|
|
|
|
GetPythonFunction("test_compare_le");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprNe) {
|
|
|
|
GetPythonFunction("test_compare_ne");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprGe) {
|
|
|
|
GetPythonFunction("test_compare_ge");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCompareExprEq) {
|
|
|
|
GetPythonFunction("test_compare_eq");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolOpTwoAnd) {
|
|
|
|
GetPythonFunction("test_boolop_two_and");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolOpThreeAnd) {
|
|
|
|
GetPythonFunction("test_boolop_three_and");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolOpTwoOr) {
|
|
|
|
GetPythonFunction("test_boolop_two_or");
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolOpThreeOr) {
|
|
|
|
GetPythonFunction("test_boolop_three_or");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolOpMixAndOr) {
|
|
|
|
GetPythonFunction("test_boolop_mix_and_or");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphLambda) {
|
|
|
|
GetPythonFunction("test_lambda");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphFuncDef) {
|
|
|
|
GetPythonFunction("test_funcdef");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphSimpleClosure) {
|
|
|
|
GetPythonFunction("test_simple_closure");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphTestTuple) {
|
|
|
|
GetPythonFunction("test_tuple_fn");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphTupleAssign) {
|
|
|
|
GetPythonFunction("test_assign_tuple");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphTestList) {
|
|
|
|
GetPythonFunction("test_list_fn");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphUnaryOp) {
|
|
|
|
GetPythonFunction("test_unary");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphAguassign) {
|
|
|
|
GetPythonFunction("test_augassign");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseSystemFunction) {
|
|
|
|
GetPythonFunction("test_sys_call");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphBoolNot) {
|
|
|
|
GetPythonFunction("test_bool_not");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
|
|
|
|
// save the func_graph to manager
|
|
|
|
std::shared_ptr<FuncGraphManager> manager = Manage(ret_val);
|
|
|
|
|
|
|
|
// call resolve
|
|
|
|
bool ret_ = ResolveAll(manager);
|
|
|
|
|
|
|
|
ASSERT_TRUE(ret_);
|
|
|
|
|
|
|
|
// draw graph
|
|
|
|
int i = 0;
|
|
|
|
for (auto tmp : manager->func_graphs()) {
|
|
|
|
std::string name = "ut_parser_for_not_" + std::to_string(i) + ".dot";
|
|
|
|
draw::Draw(name, tmp);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestCallPythonFnUseTupleParamete) {
|
|
|
|
GetPythonFunction("test_call_fn_use_tuple");
|
|
|
|
|
|
|
|
py::tuple params = py::tuple(5);
|
|
|
|
params[0] = 0;
|
|
|
|
params[1] = 1;
|
|
|
|
params[2] = 2.0;
|
|
|
|
params[3] = fn;
|
|
|
|
params[4] = "test_call_fn_use_tuple";
|
|
|
|
py::object result =
|
|
|
|
python_adapter::CallPyFn("gtest_input.pipeline.parse.parser_test", "test_call_fn_use_tuple", params);
|
|
|
|
|
|
|
|
int ret_size = py::cast<int>(result);
|
|
|
|
|
|
|
|
ASSERT_EQ(ret_size, 5);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphSubscriptSetitem) {
|
|
|
|
GetPythonFunction("test_subscript_setitem");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
|
|
|
|
std::shared_ptr<FuncGraphManager> manager = Manage(ret_val);
|
|
|
|
bool ret_ = ResolveAll(manager);
|
|
|
|
ASSERT_TRUE(ret_);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphDict) {
|
|
|
|
GetPythonFunction("test_dict");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
|
|
|
|
std::shared_ptr<FuncGraphManager> manager = Manage(ret_val);
|
|
|
|
bool ret_ = ResolveAll(manager);
|
|
|
|
ASSERT_TRUE(ret_);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(TestParser, TestParseGraphCallVargs) {
|
|
|
|
GetPythonFunction("test_call_variable");
|
|
|
|
|
|
|
|
FuncGraphPtr ret_val = ParsePythonCode(fn);
|
|
|
|
ASSERT_TRUE(nullptr != ret_val);
|
|
|
|
|
|
|
|
std::shared_ptr<FuncGraphManager> manager = Manage(ret_val);
|
|
|
|
bool ret_ = ResolveAll(manager);
|
|
|
|
ASSERT_TRUE(ret_);
|
|
|
|
}
|
|
|
|
} // namespace parse
|
|
|
|
} // namespace mindspore
|