Skip to content

Instantly share code, notes, and snippets.

@rusdevops
Last active June 11, 2019 06:00
Show Gist options
  • Save rusdevops/28085facb7c1a74efcd00d71148fec95 to your computer and use it in GitHub Desktop.
Save rusdevops/28085facb7c1a74efcd00d71148fec95 to your computer and use it in GitHub Desktop.

Задание

Необходимо для каждого пункта задания написать команды.

  1. Создать рабочую директорию workspace/${GITHUB_USERNAME}
  2. Перейти в текущую директорию в ней создать пустой репозиторий repo
  3. Создать файл README.md с указанием текущей даты.
  4. Сделать первый коммит (указав настройки с помощью git config)
  5. Добавить ветку develop и перейти на нее.
  6. Добавить удаленный репозиторий и отправить на него измения.
  7. Реализовать программу принимающую на вход целое число и
    выдающая в качестве результата значение факториала от данного числа
  8. Написать 3-4 тестовых сценария с помощью фреймворка для тестирования GTest или Catch
    (factorial(0), factorial(1), factorial(2), factorial(-5))
  9. Обеспечить непрерывный процесс сборки
  10. Обеспечить непрерывный процесс тестирования
  11. Обеспечить непрерывный процесс инсталирования
  12. Собрать 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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment