# 作業二
## 作業概述
- 本次作業完成以下測試
- Edge Coverage
- Edge-Pair Coverage
- Path Coverage
- 包含
- 12 行程式碼
- 3 個 test case
## 程式結構分析
### 主要函式流程圖
#### 主流程

#### 條件判斷(錯誤檢查)

#### 條件判斷(檢查邊界條件)

#### 迴圈

### 測試特別結構分析
- 1 到 4 行為條件判斷
- 判斷是否為整數且為非負整數
- 5 到 6 行為條件判斷
- 判斷輸入值是否是特殊值
- 9 到 11 行為迴圈
- 計算非特殊輸入值之階乘結果
- 12 行爲回傳
- 回傳計算結果
### 程式碼
```python
def calculate_factorial(n):
# 條件判斷 - 錯誤檢查
is_valid_type = isinstance(n, int) #第一行
is_non_negative = n >= 0 #第二行
if not is_valid_type or not is_non_negative: #第三行
return None #第四行
# 條件判斷 - 檢查邊界條件
if n == 0: #第五行
return 1 #第六行
# 初始化變數
result = 1 #第七行
i = 1 #第八行
# 迴圈 - 計算階層
while i <= n: #第九行
result = result * i #第十行
i = i + 1 #第十一行
# 返回結果
return result #第十二行
```
###
| 邊編號 (Edge) | 邊描述 |
| -------- | -------- |
| E1 | 錯誤發生 |
| E2 | 錯誤未發生 |
| E3 | 邊界條件滿足 |
| E4 | 邊界條件未滿足 |
| E5 | 初始化到迴圈判斷 (第一次檢查)|
| E6 | 迴圈條件滿足 (進入迴圈體) |
| E7 | 迴圈體結束 (返回迴圈判斷) |
| E8 | 迴圈條件不滿足 (跳出迴圈) |
| 區塊編號 (Node) | 區塊描述 |
| -------- | -------- |
| N1 | 錯誤檢查 |
| N2 | 檢查邊界條件並回傳 |
| N3 | 初始化變數 |
| N4 | 迴圈條件|
| N5 | 迴圈體 |
| N6 | 返回結果 |
### 測試案例
| Test Case 1 | Result |
| -------- | -------- |
| Input values | `n = -5` |
| Expected result | `None` |
| Test program's result | `None` |
| Criteria analysis (Edge) | E1 |
| Criteria analysis (Edge-Pair) | 無 |
| Criteria analysis (Path) | N1 |
| Test Case 2 | Result |
| -------- | -------- |
| Input values | `n = 0` |
| Expected result | `1` |
| Test program's result | `1` |
| Criteria analysis (Edge) | E2, E3 |
| Criteria analysis (Edge-Pair) | (E2,E3) |
| Criteria analysis (Path) | N1 → N2 → N6 |
| Test Case 3 | Result |
| -------- | -------- |
| **Input values** | `n = 5` |
| **Expected result** | `120` |
| **Test program's result** | `120` |
| Criteria analysis (Edge) | E2, E4, E5, E6, E7, E8 |
| Criteria analysis (Edge-Pair) | (E2,E4),(E4,E5),(E5,E6),(E6,E7),(E7,E6),(E7,E8) |
| Criteria analysis (Path) | N1 → N2 → N3 → N4 → (N5 → N4) 循環 → N6 |
## 測試案例詳述
- 測試案例一
- 測試輸入為負數的狀況
- Edge Coverage:E1
- Path Coverage:N1
- 測試案例二
- 測試輸入為特殊值的狀況
- Edge Coverage:E2, E3
- Edge-Pair Coverage:(E2,E3)
- Path Coverage:N1 → N2 → N6
- 測試案例三
- 測試非特殊值有效輸入的狀況
- Edge Coverage:E2, E4, E5, E6, E7, E8
- Edge-Pair Coverage:(E2,E4),(E4,E5),(E5,E6),(E6,E7),(E7,E6),(E7,E8)
- Path Coverage:N1 → N2 → N3 → N4 → (N5 → N4) 循環 → N6
## 測試工具展示
- 測試案例一
```python
def test_error_input_negative():
# 測試案例 1 - 錯誤輸入:負數
n = -5
expected = None
result = calculate_factorial(n)
print(f"Test case 1 - Negative input: n = {n}, expected = {expected}, result = {result}")
assert result == expected
```

- 測試案例二
```python
def test_boundary_input_zero():
# 測試案例 2 - 特殊值:0
n = 0
expected = 1
result = calculate_factorial(n)
print(f"Test case 3 - Zero input: n = {n}, expected = {expected}, result = {result}")
assert result == expected
```

- 測試案例三
```python
def test_valid_input_integer():
# 測試案例 3 - 非特殊值有效輸入:正整數
n = 5
expected = 120
result = calculate_factorial(n)
print(f"Test case 4 - Positive integer: n = {n}, expected = {expected}, result = {result}")
assert result == expected
```

## 測試結果
```
python3 -m pytest
collected 3 items [100%]
=== 3 passed in 0.01s ===
```
