完成
This commit is contained in:
214
golang-learning/10-projects/01-calculator/calculator_test.go
Normal file
214
golang-learning/10-projects/01-calculator/calculator_test.go
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
calculator_test.go - 计算器测试文件
|
||||
测试计算器的各种功能
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"./calculator"
|
||||
)
|
||||
|
||||
// TestBasicOperations 测试基本运算
|
||||
func TestBasicOperations(t *testing.T) {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
expression string
|
||||
expected float64
|
||||
shouldErr bool
|
||||
}{
|
||||
{"加法", "2 + 3", 5, false},
|
||||
{"减法", "10 - 4", 6, false},
|
||||
{"乘法", "3 * 7", 21, false},
|
||||
{"除法", "15 / 3", 5, false},
|
||||
{"浮点数加法", "2.5 + 1.5", 4, false},
|
||||
{"浮点数除法", "7.5 / 2.5", 3, false},
|
||||
{"负数", "-5 + 3", -2, false},
|
||||
{"除零错误", "5 / 0", 0, true},
|
||||
{"空表达式", "", 0, true},
|
||||
{"无效字符", "2 + a", 0, true},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := calc.Calculate(tt.expression)
|
||||
|
||||
if tt.shouldErr {
|
||||
if err == nil {
|
||||
t.Errorf("期望出现错误,但没有错误")
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Errorf("不期望出现错误,但出现了错误: %v", err)
|
||||
}
|
||||
if result != tt.expected {
|
||||
t.Errorf("期望结果 %g,实际结果 %g", tt.expected, result)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestComplexExpressions 测试复杂表达式
|
||||
func TestComplexExpressions(t *testing.T) {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
expression string
|
||||
expected float64
|
||||
}{
|
||||
{"括号运算", "(2 + 3) * 4", 20},
|
||||
{"嵌套括号", "((2 + 3) * 4) - 5", 15},
|
||||
{"运算优先级", "2 + 3 * 4", 14},
|
||||
{"复杂表达式", "10 + (5 - 2) * 3", 19},
|
||||
{"多层嵌套", "(2 + (3 * 4)) / 2", 7},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := calc.Calculate(tt.expression)
|
||||
if err != nil {
|
||||
t.Errorf("不期望出现错误: %v", err)
|
||||
}
|
||||
if result != tt.expected {
|
||||
t.Errorf("期望结果 %g,实际结果 %g", tt.expected, result)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestHistory 测试历史记录功能
|
||||
func TestHistory(t *testing.T) {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
// 执行一些计算
|
||||
expressions := []string{"2 + 3", "10 - 4", "3 * 7"}
|
||||
for _, expr := range expressions {
|
||||
_, err := calc.Calculate(expr)
|
||||
if err != nil {
|
||||
t.Errorf("计算 %s 时出现错误: %v", expr, err)
|
||||
}
|
||||
}
|
||||
|
||||
// 检查历史记录
|
||||
history := calc.GetHistory()
|
||||
if len(history) != len(expressions) {
|
||||
t.Errorf("期望历史记录数量 %d,实际数量 %d", len(expressions), len(history))
|
||||
}
|
||||
|
||||
// 验证历史记录内容
|
||||
for i, record := range history {
|
||||
if record.Expression != expressions[i] {
|
||||
t.Errorf("历史记录 %d 表达式不匹配,期望 %s,实际 %s",
|
||||
i, expressions[i], record.Expression)
|
||||
}
|
||||
}
|
||||
|
||||
// 测试清空历史记录
|
||||
calc.ClearHistory()
|
||||
history = calc.GetHistory()
|
||||
if len(history) != 0 {
|
||||
t.Errorf("清空后期望历史记录数量 0,实际数量 %d", len(history))
|
||||
}
|
||||
}
|
||||
|
||||
// TestErrorHandling 测试错误处理
|
||||
func TestErrorHandling(t *testing.T) {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
errorTests := []struct {
|
||||
name string
|
||||
expression string
|
||||
errorMsg string
|
||||
}{
|
||||
{"括号不匹配1", "(2 + 3", "括号不匹配"},
|
||||
{"括号不匹配2", "2 + 3)", "括号不匹配"},
|
||||
{"连续运算符", "2 ++ 3", "连续的运算符"},
|
||||
{"除零", "5 / 0", "除零错误"},
|
||||
{"无效字符", "2 + @", "包含无效字符"},
|
||||
{"空表达式", "", "表达式不能为空"},
|
||||
}
|
||||
|
||||
for _, tt := range errorTests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
_, err := calc.Calculate(tt.expression)
|
||||
if err == nil {
|
||||
t.Errorf("期望出现错误,但没有错误")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkCalculate 基准测试
|
||||
func BenchmarkCalculate(b *testing.B) {
|
||||
calc := calculator.NewCalculator()
|
||||
expression := "(2 + 3) * 4 - 1"
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, err := calc.Calculate(expression)
|
||||
if err != nil {
|
||||
b.Errorf("计算出现错误: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkSimpleAddition 简单加法基准测试
|
||||
func BenchmarkSimpleAddition(b *testing.B) {
|
||||
calc := calculator.NewCalculator()
|
||||
expression := "2 + 3"
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, err := calc.Calculate(expression)
|
||||
if err != nil {
|
||||
b.Errorf("计算出现错误: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkComplexExpression 复杂表达式基准测试
|
||||
func BenchmarkComplexExpression(b *testing.B) {
|
||||
calc := calculator.NewCalculator()
|
||||
expression := "((2 + 3) * 4 - 1) / (5 + 2)"
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, err := calc.Calculate(expression)
|
||||
if err != nil {
|
||||
b.Errorf("计算出现错误: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ExampleCalculator_Calculate 计算器使用示例
|
||||
func ExampleCalculator_Calculate() {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
result, err := calc.Calculate("2 + 3")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("%.0f", result)
|
||||
// Output: 5
|
||||
}
|
||||
|
||||
// ExampleCalculator_ComplexExpression 复杂表达式示例
|
||||
func ExampleCalculator_ComplexExpression() {
|
||||
calc := calculator.NewCalculator()
|
||||
|
||||
result, err := calc.Calculate("(2 + 3) * 4")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("%.0f", result)
|
||||
// Output: 20
|
||||
}
|
Reference in New Issue
Block a user