10 #ifndef OPENVDB_AX_UNITTEST_UTIL_HAS_BEEN_INCLUDED 11 #define OPENVDB_AX_UNITTEST_UTIL_HAS_BEEN_INCLUDED 24 #include <type_traits> 26 #define ERROR_MSG(Msg, Code) Msg + std::string(": \"") + Code + std::string("\"") 28 #define TEST_SYNTAX_PASSES(Tests) \ 30 openvdb::ax::Logger logger;\ 31 for (const auto& test : Tests) { \ 33 const std::string& code = test.first; \ 34 openvdb::ax::ast::Tree::ConstPtr tree = openvdb::ax::ast::parse(code.c_str(), logger);\ 35 std::stringstream str; \ 36 CPPUNIT_ASSERT_MESSAGE(ERROR_MSG("Unexpected parsing error(s)\n", str.str()), tree); \ 40 #define TEST_SYNTAX_FAILS(Tests) \ 42 openvdb::ax::Logger logger([](const std::string&) {});\ 43 for (const auto& test : Tests) { \ 45 const std::string& code = test.first; \ 46 openvdb::ax::ast::Tree::ConstPtr tree = openvdb::ax::ast::parse(code.c_str(), logger);\ 47 CPPUNIT_ASSERT_MESSAGE(ERROR_MSG("Expected parsing error", code), logger.hasError()); \ 56 using CodeTests = std::vector<std::pair<std::string, openvdb::ax::ast::Node::Ptr>>;
61 inline void replace(std::string& str,
const std::string& oldStr,
const std::string& newStr)
63 std::string::size_type pos = 0u;
64 while ((pos = str.find(oldStr, pos)) != std::string::npos) {
65 str.replace(pos, oldStr.length(), newStr);
66 pos += newStr.length();
73 const std::vector<const openvdb::ax::ast::Node*>& b,
const bool allowEmpty =
false)
75 if (!allowEmpty && (a.empty() || b.empty()))
return false;
76 if (a.size() != b.size())
return false;
77 const size_t size = a.size();
78 for (
size_t i = 0; i < size; ++i) {
79 if ((a[i] ==
nullptr) ^ (b[i] ==
nullptr))
return false;
80 if (a[i] ==
nullptr)
continue;
81 if (a[i]->nodetype() != b[i]->nodetype())
return false;
87 if (a[i]->nodetype() == openvdb::ax::ast::Node::AssignExpressionNode) {
88 if (static_cast<const openvdb::ax::ast::AssignExpression*>(a[i])->operation() !=
89 static_cast<const openvdb::ax::ast::AssignExpression*>(b[i])->operation()) {
93 else if (a[i]->nodetype() == openvdb::ax::ast::Node::BinaryOperatorNode) {
94 if (static_cast<const openvdb::ax::ast::BinaryOperator*>(a[i])->operation() !=
95 static_cast<const openvdb::ax::ast::BinaryOperator*>(b[i])->operation()) {
99 else if (a[i]->nodetype() == openvdb::ax::ast::Node::CrementNode) {
100 if (static_cast<const openvdb::ax::ast::Crement*>(a[i])->operation() !=
101 static_cast<const openvdb::ax::ast::Crement*>(b[i])->operation()) {
104 if (static_cast<const openvdb::ax::ast::Crement*>(a[i])->post() !=
105 static_cast<const openvdb::ax::ast::Crement*>(b[i])->post()) {
109 else if (a[i]->nodetype() == openvdb::ax::ast::Node::CastNode) {
110 if (static_cast<const openvdb::ax::ast::Cast*>(a[i])->type() !=
111 static_cast<const openvdb::ax::ast::Cast*>(b[i])->type()) {
115 else if (a[i]->nodetype() == openvdb::ax::ast::Node::FunctionCallNode) {
116 if (static_cast<const openvdb::ax::ast::FunctionCall*>(a[i])->name() !=
117 static_cast<const openvdb::ax::ast::FunctionCall*>(b[i])->name()) {
121 else if (a[i]->nodetype() == openvdb::ax::ast::Node::LoopNode) {
122 if (static_cast<const openvdb::ax::ast::Loop*>(a[i])->loopType() !=
123 static_cast<const openvdb::ax::ast::Loop*>(b[i])->loopType()) {
127 else if (a[i]->nodetype() == openvdb::ax::ast::Node::KeywordNode) {
128 if (static_cast<const openvdb::ax::ast::Keyword*>(a[i])->keyword() !=
129 static_cast<const openvdb::ax::ast::Keyword*>(b[i])->keyword()) {
133 else if (a[i]->nodetype() == openvdb::ax::ast::Node::AttributeNode) {
134 if (static_cast<const openvdb::ax::ast::Attribute*>(a[i])->type() !=
135 static_cast<const openvdb::ax::ast::Attribute*>(b[i])->type()) {
138 if (static_cast<const openvdb::ax::ast::Attribute*>(a[i])->name() !=
139 static_cast<const openvdb::ax::ast::Attribute*>(b[i])->name()) {
142 if (static_cast<const openvdb::ax::ast::Attribute*>(a[i])->inferred() !=
143 static_cast<const openvdb::ax::ast::Attribute*>(b[i])->inferred()) {
147 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ExternalVariableNode) {
148 if (static_cast<const openvdb::ax::ast::ExternalVariable*>(a[i])->type() !=
149 static_cast<const openvdb::ax::ast::ExternalVariable*>(b[i])->type()) {
152 if (static_cast<const openvdb::ax::ast::ExternalVariable*>(a[i])->name() !=
153 static_cast<const openvdb::ax::ast::ExternalVariable*>(b[i])->name()) {
157 else if (a[i]->nodetype() == openvdb::ax::ast::Node::DeclareLocalNode) {
158 if (static_cast<const openvdb::ax::ast::DeclareLocal*>(a[i])->type() !=
159 static_cast<const openvdb::ax::ast::DeclareLocal*>(b[i])->type()) {
163 else if (a[i]->nodetype() == openvdb::ax::ast::Node::LocalNode) {
164 if (static_cast<const openvdb::ax::ast::Local*>(a[i])->name() !=
165 static_cast<const openvdb::ax::ast::Local*>(b[i])->name()) {
170 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueBoolNode) {
171 if (
static_cast<const openvdb::ax::ast::Value<bool>*
>(a[i])->
value() !=
172 static_cast<const openvdb::ax::ast::Value<bool>*
>(b[i])->
value()) {
176 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueInt16Node) {
177 if (
static_cast<const openvdb::ax::ast::Value<int16_t>*
>(a[i])->
value() !=
178 static_cast<const openvdb::ax::ast::Value<int16_t>*
>(b[i])->
value()) {
182 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueInt32Node) {
183 if (
static_cast<const openvdb::ax::ast::Value<int32_t>*
>(a[i])->
value() !=
184 static_cast<const openvdb::ax::ast::Value<int32_t>*
>(b[i])->
value()) {
188 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueInt64Node) {
189 if (
static_cast<const openvdb::ax::ast::Value<int64_t>*
>(a[i])->
value() !=
190 static_cast<const openvdb::ax::ast::Value<int64_t>*
>(b[i])->
value()) {
194 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueFloatNode) {
195 if (
static_cast<const openvdb::ax::ast::Value<float>*
>(a[i])->
value() !=
196 static_cast<const openvdb::ax::ast::Value<float>*
>(b[i])->
value()) {
200 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueDoubleNode) {
201 if (
static_cast<const openvdb::ax::ast::Value<double>*
>(a[i])->
value() !=
202 static_cast<const openvdb::ax::ast::Value<double>*
>(b[i])->
value()) {
206 else if (a[i]->nodetype() == openvdb::ax::ast::Node::ValueStrNode) {
207 if (
static_cast<const openvdb::ax::ast::Value<std::string>*
>(a[i])->
value() !=
208 static_cast<const openvdb::ax::ast::Value<std::string>*
>(b[i])->
value()) {
216 inline std::vector<std::string>
219 std::vector<std::string> names;
220 if (number <= 0)
return names;
221 names.reserve(number);
223 for (
size_t i = 1; i <= number; i++) {
224 names.emplace_back(base + std::to_string(i));
231 #endif // OPENVDB_AX_UNITTEST_UTIL_HAS_BEEN_INCLUDED Provides the definition for every abstract and concrete derived class which represent a particular ab...
Parsing methods for creating abstract syntax trees out of AX code.
std::vector< std::pair< std::string, openvdb::ax::ast::Node::Ptr >> CodeTests
Definition: util.h:56
void replace(std::string &str, const std::string &oldStr, const std::string &newStr)
Definition: util.h:61
ValueT value
Definition: GridBuilder.h:1287
Logging system to collect errors and warnings throughout the different stages of parsing and compilat...
Various function and operator tokens used throughout the AST and code generation. ...
std::vector< std::string > nameSequence(const std::string &base, const size_t number)
Definition: util.h:217
bool compareLinearTrees(const std::vector< const openvdb::ax::ast::Node * > &a, const std::vector< const openvdb::ax::ast::Node * > &b, const bool allowEmpty=false)
Definition: util.h:72