1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/*************************************************************************
* Copyright (C) 2018-2022 Blue Brain Project
*
* This file is part of NMODL distributed under the terms of the GNU
* Lesser General Public License. See top-level LICENSE file for details.
*************************************************************************/
#include <catch2/catch_test_macros.hpp>
#include "ast/program.hpp"
#include "parser/nmodl_driver.hpp"
#include "test/unit/utils/test_utils.hpp"
#include "visitors/checkparent_visitor.hpp"
#include "visitors/inline_visitor.hpp"
#include "visitors/localize_visitor.hpp"
#include "visitors/symtab_visitor.hpp"
#include "visitors/visitor_utils.hpp"
using namespace nmodl;
using namespace visitor;
using namespace test;
using namespace test_utils;
using ast::AstNodeType;
using nmodl::parser::NmodlDriver;
//=============================================================================
// Passes can run multiple times
//=============================================================================
void run_visitor_passes(const std::string& text) {
NmodlDriver driver;
const auto& ast = driver.parse_string(text);
{
SymtabVisitor v1;
InlineVisitor v2;
LocalizeVisitor v3;
CheckParentVisitor v4(true);
v1.visit_program(*ast);
v2.visit_program(*ast);
v3.visit_program(*ast);
v4.check_ast(*ast);
v4.check_ast(*ast);
v1.visit_program(*ast);
v1.visit_program(*ast);
v4.check_ast(*ast);
v2.visit_program(*ast);
v3.visit_program(*ast);
v2.visit_program(*ast);
v4.check_ast(*ast);
}
}
SCENARIO("Running visitor passes multiple times", "[visitor]") {
GIVEN("A mod file") {
std::string nmodl_text = R"(
NEURON {
RANGE tau
}
DERIVATIVE states {
tau = 11.1
exp(tau)
}
)";
THEN("Passes can run multiple times") {
std::string input = reindent_text(nmodl_text);
REQUIRE_NOTHROW(run_visitor_passes(input));
}
}
}
//=============================================================================
// to_nmodl with excluding set of node types
//=============================================================================
SCENARIO("Sympy specific AST to NMODL conversion") {
GIVEN("NMODL block with unit usage") {
static const std::string nmodl = R"(
BREAKPOINT {
Pf_NMDA = (1/1.38) * 120 (mM) * 0.6
VDCC = gca_bar_VDCC * 4(um2)*PI*3(1/um3)
gca_bar_VDCC = 0.0372 (nS/um2)
}
)";
static const std::string expected = R"(
BREAKPOINT {
Pf_NMDA = (1/1.38)*120*0.6
VDCC = gca_bar_VDCC*4*PI*3
gca_bar_VDCC = 0.0372
}
)";
THEN("to_nmodl can ignore all units") {
auto input = reindent_text(nmodl);
NmodlDriver driver;
const auto& ast = driver.parse_string(input);
const auto& result = to_nmodl(ast, {AstNodeType::UNIT});
REQUIRE(result == reindent_text(expected));
}
}
}
|