Тестирование синтаксического анализатора конфигурации Yaml-cpp с CppUTest выдает «ожидаемый спецификатор типа перед символом‘ (’» - PullRequest
0 голосов
/ 16 мая 2019

Я использую библиотеку yaml-cpp (v 0.6.0) для анализа файла конфигурации yaml.Yaml-cpp установлен как системная библиотека.

Я создал класс Parser, который проверяет наличие пар ключ-значение в узле yaml.Класс Parser построен как статическая библиотека ConfigParserLibrary.

Теперь я хочу протестировать класс Parser с использованием CppUTest.Строим проект с CMake.Пример кода:

CMakeLists:

cmake_minimum_required(VERSION 3.9)
project(yaml-parser VERSION 0.1.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ConfigParserLibrary lib
include_directories(${PROJECT_SOURCE_DIR}/include/config_parser_lib)
file(GLOB_RECURSE LIB_CONFIG_PARSER_SRC "config_parser_lib/Parser.cpp")
add_library(ConfigParserLibrary STATIC ${LIB_CONFIG_PARSER_SRC})
target_link_libraries(ConfigParserLibrary yaml-cpp)

# Executable that uses ConfigParserLibrary
add_executable(conf_reader "config_reader.cpp")
target_link_libraries(conf_reader yaml-cpp ConfigParserLibrary)

message(STATUS "Library tests will be built.")
add_library(ConfigParserTests STATIC tests/ConfigParserTests.cpp)
target_link_libraries(ConfigParserTests ConfigParserLibrary yaml-cpp)

add_executable(RunLibTests tests/RunTests.cpp)
target_link_libraries(RunLibTests CppUTest CppUTestExt
    ConfigParserTests ConfigParserLibrary yaml-cpp)
add_test(NAME test_library COMMAND RunLibTests)

Когда я использую класс Parser в другом исполняемом файле, он компилируется без ошибок.Но когда я включаю файл config_parser_lib / Parser.hpp в файл ConfigParserTests.cpp, он вызывает: /usr/include/c++/8/optional:208: error: expected type-specifier before ‘(’ token ::new ((void *) std::__addressof(this->_M_payload)) ^.enter image description here Parser.hpp

#pragma once
#include <yaml-cpp/yaml.h>

class Parser{
public:
    int parseNode(YAML::Node configNode); 
};

Parser.cpp

#include "config_parser_lib/Parser.hpp"

int Parser::parseNode(YAML::Node configNode){
    return valueA = configNode["keyA"].as<int>();
}

ConfigParserTests.cpp

#include <CppUTest/TestHarness.h>
#include "config_parser_lib/Parser.hpp"

TEST_GROUP(ConfigParserTests) {
};

TEST(ConfigParserTests, ParseConfigNode){
}

RunTests.cpp

#include <CppUTest/CommandLineTestRunner.h>

IMPORT_TEST_GROUP(ConfigParserTests);

int main(int ac, const char** av)
{
    return CommandLineTestRunner::RunAllTests(ac, av);
}

В CMakeLists.txt: когда я изменяю CMAKE_CXX_STANDARD с 17 на 11, я получаю следующую ошибку /usr/include/c++/8/bits/stl_tree.h:636: error: ‘__node’ does not name a type ::new(__node) _Rb_tree_node<_Val>; ^~~~~~.

Если я закомментирую строку #include "config_parser_lib/Parser.hpp" вConfigParserTests.cpp, ошибки нет.Таким образом, я думаю, что ошибка происходит от включения файла <yaml-cpp/yaml.h>.Если я включу <yaml-cpp/node/node.h> вместо yaml.h>, ошибки не будет, но мне нужен файл <yaml-cpp/yaml.h>, который включает другие заголовки, которые мне нужно использовать.

gcc версия 8.3.1 20190226.

1 Ответ

0 голосов
/ 18 июня 2019

Изменение порядка включения в ConfigParserTests.cpp решило проблему.

#include "config_parser_lib/Parser.hpp"
#include <CppUTest/TestHarness.h>

Я предполагаю, что #include <yaml-cpp/yaml.h> должно быть в начале каждой единицы перевода.

...