lcov の Branch Data [ +  - ] はどっちが TRUE でどっちが FALSE か実際の出力を確認した

# はじめに

カバレッジの計測結果を視覚的にわかりやすく表示するツール locv を使用して関数テストをしている際、網羅していない分岐条件が判らなくなる。マニュアルやブログを探してもよくわからなかったので簡単なソースコードを作成して出力を確認をした。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998205/aa0fd492-23f7-4079-3711-8346553fb3d0.png width=400>

# 環境
|項目|バージョン|
|-|-|
|OS|Ubuntu 22.04.4 LTS (WSL version 2)|
|google test|Release v1.13.0|
|g++|g++ 11.4.0|
|lcov|LCOV version 1.14|
|gcov|gcov 11.4.0|

# 実行コマンド
以下のコマンドを実行して出力される HTML 形式のファイルを確認する。

``` sh
g++ -fprofile-arcs -ftest-coverage main.cpp -pthread -lgtest_main -lgtest -lgmock
./a.out 
gcov -b a-main.gcda 
lcov -d . -c --rc lcov_branch_coverage=1 -o a-main.info
genhtml a-main.info --branch-coverage -o ./coverage
rm *.gcov *.gcda *.gcno *.info 
```

# 実行結果

|表示|意味|
|-|-|
|+|taken（条件を満たした）|
|-|not taken（条件を満たしていない）|
|#|not executed（実行されていない）|

## 条件が１個の場合
```
        :    bool A;
        :
        :    A = true;
[ +  - ]:    if( A )
        :    {
        :    }
        :    
        :    A = false;
[ -  + ]:    if( A )
        :    {
        :    }
```

## 条件が２個の場合 (A && B)
### 条件文を単一行で記載した場合
```
              :    bool A, B;
              :
              :    A = true;  B = true;
[ +  -  +  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = true;  B = false;
[ +  -  -  + ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = false; B = true;
[ -  +  -  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }
              :
              :    A = false; B = false;
[ -  +  -  - ]:    if( ( A ) && ( B ) )
              :    {
              :    }
```

### 条件文を複数行で記載した場合
```
        :    bool A, B;
        :
        :    A = true;  B = true;
[ +  - ]:    if( ( A )
[ +  - ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = true;  B = false;
[ +  - ]:    if( ( A )
[ -  + ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = false; B = true;
[ -  + ]:    if( ( A )
[ #  # ]:     && ( B ) )
        :    {
        :    }
        :
        :    A = false; B = false;
[ -  + ]:    if( ( A )
[ #  # ]:     && ( B ) )
        :    {
        :    }
```

## 条件が２個の場合 (A || B)
### 条件文を単一行で記載した場合
```
              :    bool A, B;
              :
              :    A = true;  B = true;
[ -  +  -  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = true;  B = false;
[ -  +  -  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = false; B = true;
[ +  -  +  - ]:    if( ( A ) || ( B ) )
              :    {
              :    }
              :
              :    A = false; B = false;
[ +  -  -  + ]:    if( ( A ) || ( B ) )
              :    {
              :    }
```

### 条件文を複数行で記載した場合
```
        :    bool A, B;
        :
        :    A = true;  B = true;
[ -  + ]:    if( ( A )
[ #  # ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = true;  B = false;
[ -  + ]:    if( ( A )
[ #  # ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = false; B = true;
[ +  - ]:    if( ( A )
[ +  - ]:     || ( B ) )
        :    {
        :    }
        :
        :    A = false; B = false;
[ +  - ]:    if( ( A )
[ -  + ]:     || ( B ) )
        :    {
        :    }
```

## 条件が３個の場合 (A && (B || C))
```
              :    bool A, B, C;
              :
              :    A = true;  B = true;  C = true;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = true;  C = false;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = true;
      [ +  - ]:    if( ( A )
[ +  -  +  - ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = false;
      [ +  - ]:    if( ( A )
[ +  -  -  + ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     && ( ( B ) || (C) ) )
              :    {
              :    }
```

## 条件が３個の場合 (A || (B && C))
```
              :    bool A, B, C;
              :
              :    A = true;  B = true;  C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = true;  C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = true;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = true;  B = false; C = false;
      [ -  + ]:    if( ( A )
[ #  #  #  # ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = true;
      [ +  - ]:    if( ( A )
[ +  -  +  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = true;  C = false;
      [ +  - ]:    if( ( A )
[ +  -  -  + ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = true;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
              :
              :    A = false; B = false; C = false;
      [ +  - ]:    if( ( A )
[ -  +  -  - ]:     || ( ( B ) && (C) ) )
              :    {
              :    }
```

# 参考記事
https://kinoshita-hidetoshi.github.io/Programing-Items/Etc/coverage/gcov_lcov.html