User Guide
modtoken.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 <memory.h>
9 #include <string>
10 
11 #include <catch2/catch_test_macros.hpp>
12 
13 #include "lexer/modtoken.hpp"
14 #include "lexer/nmodl_lexer.hpp"
15 #include "parser/nmodl_driver.hpp"
17 
18 
19 /** @file
20  * @defgroup token_test Token Tests
21  * @ingroup token
22  * @brief All tests for @ref token_modtoken
23  * @{
24  */
25 
26 using namespace nmodl;
29 using LocationType = nmodl::parser::location;
30 
31 template <typename T>
32 void symbol_type(const std::string& name, T& value) {
33  std::istringstream ss(name);
34  std::istream& in = ss;
35 
37  NmodlLexer scanner(driver, &in);
38 
39  auto sym = scanner.next_token();
40  value = sym.value.as<T>();
41 }
42 
43 TEST_CASE("NMODL Lexer returning valid ModToken object", "[token][modtoken]") {
44  SECTION("test for ast::Name") {
45  ast::Name value;
46  {
47  std::stringstream ss;
48  symbol_type("text", value);
49  ss << *(value.get_token());
50  REQUIRE(ss.str() == " text at [1.1-4] type 343");
51  }
52 
53  {
54  std::stringstream ss;
55  symbol_type(" some_text", value);
56  ss << *(value.get_token());
57  REQUIRE(ss.str() == " some_text at [1.3-11] type 343");
58  }
59  }
60 
61  SECTION("test for ast::Prime") {
62  ast::PrimeName value;
63  {
64  std::stringstream ss;
65  symbol_type("h'' = ", value);
66  ss << *(value.get_token());
67  REQUIRE(ss.str() == " h'' at [1.1-3] type 350");
68  REQUIRE(value.get_order()->eval() == 2);
69  }
70  }
71 }
72 
73 TEST_CASE("Addition of two ModToken objects", "[token][modtoken]") {
74  SECTION("adding two random strings") {
75  ast::Name value;
76  {
77  std::stringstream ss;
78 
79  // NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
80  nmodl::parser::position adder1_begin(nullptr, 1, 1);
81  nmodl::parser::position adder1_end(nullptr, 1, 5);
82  LocationType adder1_location(adder1_begin, adder1_end);
83  ModToken adder1("text", 1, adder1_location);
84 
85  nmodl::parser::position adder2_begin(nullptr, 2, 1);
86  nmodl::parser::position adder2_end(nullptr, 2, 5);
87  // NOLINTEND(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
88  LocationType adder2_location(adder2_begin, adder2_end);
89  ModToken adder2("text", 2, adder2_location);
90 
91  ss << adder1;
92  ss << " + ";
93  ss << adder2;
94 
95  ModToken sum = adder1 + adder2;
96  ss << " = " << sum;
97  REQUIRE(ss.str() ==
98  " text at [1.1-4] type 1 + text at [2.1-4] type 2 = "
99  " text at [1.1-2.4] type 1");
100  }
101  }
102 }
103 
104 
105 /** @} */ // end of token_test
test_utils.hpp
nmodl::parser::NmodlDriver
Class that binds all pieces together for parsing nmodl file.
Definition: nmodl_driver.hpp:67
nmodl::LocationType
nmodl::parser::location LocationType
Definition: modtoken.cpp:12
TEST_CASE
TEST_CASE("NMODL Lexer returning valid ModToken object", "[token][modtoken]")
Definition: modtoken.cpp:43
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::ast::Name::get_token
const ModToken * get_token() const noexcept override
Return associated token for the current ast node.
Definition: name.hpp:141
nmodl_lexer.hpp
nmodl::ast::PrimeName::get_order
std::shared_ptr< Integer > get_order() const noexcept
Getter for member variable PrimeName::order.
Definition: prime_name.hpp:177
driver
nmodl::parser::UnitDriver driver
Definition: parser.cpp:28
nmodl::ast::PrimeName::get_token
const ModToken * get_token() const noexcept override
Return associated token for the current ast node.
Definition: prime_name.hpp:147
nmodl::parser::NmodlLexer
Represent Lexer/Scanner class for NMODL language parsing.
Definition: nmodl_lexer.hpp:60
nmodl::ast::PrimeName
Represents a prime variable (for ODE)
Definition: prime_name.hpp:48
nmodl::parser::NmodlLexer::next_token
virtual NmodlParser::symbol_type next_token()
Function for lexer to scan token (replacement for yylex())
modtoken.hpp
nmodl_driver.hpp
symbol_type
void symbol_type(const std::string &name, T &value)
Definition: modtoken.cpp:32
nmodl::ast::Name
Represents a name.
Definition: name.hpp:44
nmodl::ModToken
Represent token returned by scanner.
Definition: modtoken.hpp:50