User Guide
implicit_argument.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include "ast/program.hpp"
15 
16 #include <catch2/catch_test_macros.hpp>
17 #include <catch2/matchers/catch_matchers_string.hpp>
18 
19 using namespace nmodl;
21 
22 using Catch::Matchers::ContainsSubstring; // ContainsSubstring in newer Catch2
23 
24 //=============================================================================
25 // Implicit visitor tests
26 //=============================================================================
27 
28 std::string generate_mod_after_implicit_argument_visitor(std::string const& text) {
30  auto const ast = driver.parse_string(text);
33  return to_nmodl(*ast);
34 }
35 
36 SCENARIO("Check insertion of implicit arguments", "[codegen][implicit_arguments]") {
37  GIVEN("A mod file that calls functions that may need implicit arguments") {
38  auto const nmodl_text = R"(
39  NEURON {
40  SUFFIX ImplicitTest
41  }
42  INITIAL {
43  at_time(foo)
44  at_time(a+b)
45  at_time(nt, flop)
46  nrn_ghk(-50(mV), .001(mM), 10(mM), 2)
47  nrn_ghk(-50(mV), .001(mM), 10(mM), 2, -273.15)
48  }
49  )";
50  auto const modified_nmodl = generate_mod_after_implicit_argument_visitor(nmodl_text);
51  THEN("at_time should have nt as its first argument") {
52  REQUIRE_THAT(modified_nmodl, ContainsSubstring("at_time(nt, foo)"));
53  REQUIRE_THAT(modified_nmodl, ContainsSubstring("at_time(nt, a+b)"));
54  REQUIRE_THAT(modified_nmodl, ContainsSubstring("at_time(nt, flop)"));
55  }
56  THEN("nrn_ghk should have a temperature as its last argument") {
57  REQUIRE_THAT(modified_nmodl,
58  ContainsSubstring("nrn_ghk(-50(mV), .001(mM), 10(mM), 2, celsius)"));
59  REQUIRE_THAT(modified_nmodl,
60  ContainsSubstring("nrn_ghk(-50(mV), .001(mM), 10(mM), 2, -273.15)"));
61  }
62  }
63 }
test_utils.hpp
nmodl::parser::NmodlDriver
Class that binds all pieces together for parsing nmodl file.
Definition: nmodl_driver.hpp:67
nmodl::to_nmodl
std::string to_nmodl(const ast::Ast &node, const std::set< ast::AstNodeType > &exclude_types)
Given AST node, return the NMODL string representation.
Definition: visitor_utils.cpp:234
generate_mod_after_implicit_argument_visitor
std::string generate_mod_after_implicit_argument_visitor(std::string const &text)
Definition: implicit_argument.cpp:28
implicit_argument_visitor.hpp
Visitor for adding implicit arguments to [Core]NEURON functions.
nmodl::test_utils::reindent_text
std::string reindent_text(const std::string &text, int indent_level)
Reindent nmodl text for text-to-text comparison.
Definition: test_utils.cpp:53
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::visitor::AstVisitor::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: ast_visitor.cpp:364
nmodl::visitor::SymtabVisitor
Concrete visitor for constructing symbol table from AST.
Definition: symtab_visitor.hpp:37
nmodl::visitor::SymtabVisitor::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: symtab_visitor.cpp:215
visitor_utils.hpp
Utility functions for visitors implementation.
program.hpp
Auto generated AST classes declaration.
driver
nmodl::parser::UnitDriver driver
Definition: parser.cpp:28
SCENARIO
SCENARIO("Check insertion of implicit arguments", "[codegen][implicit_arguments]")
Definition: implicit_argument.cpp:36
nmodl::parser::UnitDriver::parse_string
bool parse_string(const std::string &input)
parser Units provided as string (used for testing)
Definition: unit_driver.cpp:40
nmodl_driver.hpp
symtab_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
nmodl::visitor::ImplicitArgumentVisitor
Visitor for adding implicit arguments to [Core]NEURON functions.
Definition: implicit_argument_visitor.hpp:37
nmodl_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.