Необходимо для каждого пункта задания написать команды.
- Создать рабочую директорию
workspace/${GITHUB_USERNAME}
- Перейти в текущую директорию в ней создать пустой репозиторий repo
- Создать файл README.md с указанием текущей даты.
- Сделать первый коммит (указав настройки с помощью
git config
) - Добавить ветку develop и перейти на нее.
- Добавить удаленный репозиторий и отправить на него измения.
- Реализовать программу принимающую на вход целое число и
выдающая в качестве результата значение факториала от данного числа - Написать 3-4 тестовых сценария с помощью фреймворка для тестирования GTest или Catch
(factorial(0), factorial(1), factorial(2), factorial(-5)
) - Обеспечить непрерывный процесс сборки
- Обеспечить непрерывный процесс тестирования
- Обеспечить непрерывный процесс инсталирования
- Собрать DEB-пакет или RPM-пакет или DMG образ
Необходимая структура репозитория:
- apps/demo.cpp
- include/factorial.h
- sources/factorial.cpp
- tests/factorial.cpp
- CMakeLists.txt
- CPackConfig.cmake
- README.md
- .travis.yml
Необходимая структура инсталяции:
- bin/demo
- include/factorial.h
- lib/factorial.a
- share/README.md
Пример работы демонстрационного приложения:
$ ./_builds/demo
# input number: 0⏎
1
$ ./_builds/demo 1
1
$ ./_builds/demo word
# throw invalid_argument
$ ./_builds/demo -5
# throw out_of_range
$ ./_builds/demo 2 1
# throw domain_error
Установка пакетнго менеджера:
$ mkdir -p cmake
$ wget https://github.com/hunter-packages/gate/archive/v0.9.0.tar.gz -O gate.tar.gz
$ tar -xf gate.tar.gz && mv gate-0.9.0/cmake/HunterGate.cmake cmake/
$ rm -rf gate-0.9.0 gate.tar.gz
Подключение GTest и Boost пакета:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
option(FACTORIAL_BUILD_EXAMPLE "..." OFF)
include("cmake/HunterGate.cmake")
huntergate(
URL "https://github.com/ruslo/hunter/archive/v0.23.177.tar.gz"
SHA1 "c3d4bf987a1c5f8ce9bb8b2b80bc6c123185cd66"
)
project(factorial)
hunter_add_package(GTest)
find_package(GTest CONFIG REQUIRED)
add_library(factorial ...)
add_executable(demo ...) # apps/demo.cpp
...
enable_testing()
add_executable(factorial_tests ...)
target_link_libraries(factorial_tests ...)
add_test(NAME factorial_tests ...)
install(TARGETS factorial demo
...
)
install(DIRECTORY ...)
install(EXPORT "factorial-config"
NAMESPACE "..."
DESTINATION cmake
)
include(CPackConfig.cmake)
Примеры файлов исходного кода:
// include/factorial.h
int factorial(int value);
// sources/factorial.cpp
#include <factorial.h>
int factorial(int n) {
if (n < 0) throw out_of_range{"..."};
if (n == 0) return 1;
if (n == 1) return 1;
return n*factorial(n-1);
}
// apps/demo.cpp
#include <exception>
#include <string>
#include <boost/lexical_cast.hpp>
#include <factorial.h>
int main(int argc, char* argv[]) {
using boost::lexical_cast;
int number = 0;
if (argc > 2) throw std::domain_error{"..."};
if (argc < 2) {
std::cin >> number;
}
int number = lexical_cast<int>(argv[1]);
if (number < 0) throw invalid_argument{"..."};
std::cout << factorial(number) << std::endl;
}
Примеры тестовых сценариев:
// tests/factorial.cpp
#include <factorial.h>
#include <gtest/gtest.h>
TEST(Factorial, Zero)
{
EXPECT_EQ(factorial(0), 1);
}
TEST(Factorial, Negative)
{
EXPECT_TROW(factorial(-4), std::out_of_range);
}