Google TestでC++の単体テストをやってみた①

# はじめに
久しぶりにC++でちょっとしたプログラムを書く機会を得たので、googleのテストフレームワークについて勉強することにした。
CentOS7環境にgoogletestをインストールしようとして、少し詰まったところを備忘録的に。要約すると、

- gccはversion 5以上でないといけない
- cmakeする際に、コンパイラ指定とC++11の有効化

が必要だった。結局、今回はインストールするところまで。

# インストール
## 元の環境を利用

- CentOS Linux release 7.6.1810 (Core)
- gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- cmake version 2.8.12.2

Google TestのリポジトリのREADMEに従ってインストール。
https://github.com/google/googletest/tree/main/googletest

```sh
$ git clone https://github.com/google/googletest.git -b release-1.11.0
$ cd googletest
$ mkdir build
$ cd build
$ cmake ..
$ make
Scanning dependencies of target gtest
[ 25%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
                 from /home/server/tmp/googletest/googletest/include/gtest/gtest.h:59,
                 from /home/server/tmp/googletest/googletest/src/gtest-all.cc:38:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
```

cmakeするときにフラグを指定する。

```sh
$ cmake -DCMAKE_CXX_FLAGS="-std=c++11" ..
$ make
Scanning dependencies of target gtest
[ 25%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
In file included from /home/server/tmp/googletest/googletest/include/gtest/internal/gtest-death-test-internal.h:39:0,
                 from /home/server/tmp/googletest/googletest/include/gtest/gtest-death-test.h:41,
                 from /home/server/tmp/googletest/googletest/include/gtest/gtest.h:64,
                 from /home/server/tmp/googletest/googletest/src/gtest-all.cc:38:
/home/server/tmp/googletest/googletest/include/gtest/gtest-matchers.h: In static member function ‘static constexpr bool testing::internal::MatcherBase<T>::IsInlined()’:
/home/server/tmp/googletest/googletest/include/gtest/gtest-matchers.h:414:12: error: ‘is_trivially_copy_constructible’ is not a member of ‘std’
            std::is_trivially_copy_constructible<M>::value &&
```

is_trivially_copy_constructibleはgcc ver.5以上でないとだめらしい。

## gccを5.2.0にして再度インストール

- gcc version 5.2.0 (GCC)

```sh
$ cmake -DCMAKE_CXX_FLAGS="-std=c++11" ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.5")
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/server/tmp/googletest/build
```

$PATHの先頭にgcc-5.2.0を加えてみたけど、依然4.8.5が指定されているっぽい。
-DCMAKE_CXX_COMPILERオプションをつけることで、コンパイラを明示的に指定できるらしい。

```sh
$ cmake -DCMAKE_CXX_FLAGS="-std=c++11" -DCMAKE_C_COMPILER="/usr/local/gcc/5.2.0/bin/gcc" -DCMAKE_CXX_COMPILER="/usr/local/gcc/5.2.0/bin/g++" ..
-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/local/gcc/5.2.0/bin/gcc

-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- Check for working C compiler: /usr/local/gcc/5.2.0/bin/gcc
-- Check for working C compiler: /usr/local/gcc/5.2.0/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/local/gcc/5.2.0/bin/c++
-- Check for working CXX compiler: /usr/local/gcc/5.2.0/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.5")
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/server/tmp/googletest/build
```

これでどうだ。

```sh
$ make
Scanning dependencies of target gtest
[ 25%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
Linking CXX static library ../lib/libgtest.a
[ 25%] Built target gtest
Scanning dependencies of target gmock
[ 50%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
Linking CXX static library ../lib/libgmock.a
[ 50%] Built target gmock
Scanning dependencies of target gmock_main
[ 75%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
Linking CXX static library ../lib/libgmock_main.a
[ 75%] Built target gmock_main
Scanning dependencies of target gtest_main
[100%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
Linking CXX static library ../lib/libgtest_main.a
[100%] Built target gtest_main
```

とりあえずここまで。