126 lines
3.3 KiB
C++
126 lines
3.3 KiB
C++
/**
|
||
* @file basic_test.cpp
|
||
* @brief 商城系统单元测试,使用标准库 assert,无外部依赖。
|
||
*/
|
||
|
||
#include "product.hpp"
|
||
#include "shopping_cart.hpp"
|
||
#include "order.hpp"
|
||
#include <cassert>
|
||
#include <iostream>
|
||
#include <cmath>
|
||
|
||
/**
|
||
* @brief 测试商品类的构造与基本接口。
|
||
*/
|
||
static void testProduct() {
|
||
Product p(1001, "Test Book", 29.99, 50);
|
||
assert(p.getId() == 1001);
|
||
assert(p.getName() == "Test Book");
|
||
assert(std::abs(p.getPrice() - 29.99) < 0.001);
|
||
assert(p.getStock() == 50);
|
||
|
||
assert(p.reduceStock(10) == true);
|
||
assert(p.getStock() == 40);
|
||
|
||
assert(p.reduceStock(100) == false); // 库存不足
|
||
assert(p.getStock() == 40);
|
||
|
||
p.addStock(5);
|
||
assert(p.getStock() == 45);
|
||
|
||
// toString 不应为空
|
||
assert(!p.toString().empty());
|
||
std::cout << "[PASS] testProduct\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 测试购物车类的添加、移除、清空、总价。
|
||
*/
|
||
static void testShoppingCart() {
|
||
Product p1(2001, "Item A", 10.0, 100);
|
||
Product p2(2002, "Item B", 20.0, 100);
|
||
|
||
ShoppingCart cart;
|
||
assert(cart.isEmpty());
|
||
assert(cart.itemCount() == 0);
|
||
assert(std::abs(cart.totalPrice() - 0.0) < 0.001);
|
||
|
||
cart.addItem(p1, 2);
|
||
cart.addItem(p2, 3);
|
||
assert(!cart.isEmpty());
|
||
assert(cart.itemCount() == 2);
|
||
assert(std::abs(cart.totalPrice() - (10.0*2 + 20.0*3)) < 0.001);
|
||
|
||
// 再次添加相同商品应累加数量
|
||
cart.addItem(p1, 1);
|
||
assert(cart.itemCount() == 2);
|
||
assert(std::abs(cart.totalPrice() - (10.0*3 + 20.0*3)) < 0.001);
|
||
|
||
// 移除商品
|
||
assert(cart.removeItem(2001) == true);
|
||
assert(cart.itemCount() == 1);
|
||
|
||
// 修改数量
|
||
assert(cart.updateQuantity(2002, 5) == true);
|
||
assert(std::abs(cart.totalPrice() - 20.0*5) < 0.001);
|
||
|
||
// 修改不存在的商品
|
||
assert(cart.updateQuantity(9999, 1) == false);
|
||
|
||
// 清空
|
||
cart.clear();
|
||
assert(cart.isEmpty());
|
||
std::cout << "[PASS] testShoppingCart\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 测试订单类的创建与状态。
|
||
*/
|
||
static void testOrder() {
|
||
Product p1(3001, "Book", 25.0, 10);
|
||
Product p2(3002, "Pen", 3.5, 50);
|
||
|
||
ShoppingCart cart;
|
||
cart.addItem(p1, 2);
|
||
cart.addItem(p2, 4);
|
||
|
||
Order order(9001, cart);
|
||
assert(order.getOrderId() == 9001);
|
||
assert(order.getStatus() == OrderStatus::Pending);
|
||
assert(order.getItems().size() == 2);
|
||
assert(std::abs(order.totalPrice() - (25.0*2 + 3.5*4)) < 0.001);
|
||
|
||
// 确认购物车已被清空
|
||
assert(cart.isEmpty());
|
||
|
||
// 修改订单状态
|
||
order.setStatus(OrderStatus::Paid);
|
||
assert(order.getStatus() == OrderStatus::Paid);
|
||
|
||
// 订单摘要不为空
|
||
assert(!order.toString().empty());
|
||
std::cout << "[PASS] testOrder\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 测试 orderStatusToString 枚举转换。
|
||
*/
|
||
static void testOrderStatusString() {
|
||
assert(orderStatusToString(OrderStatus::Pending) == "\xe5\xbe\x85\xe6\x94\xaf\xe4\xbb\x98");
|
||
assert(orderStatusToString(OrderStatus::Delivered) == "\xe5\xb7\xb2\xe9\x80\x81\xe8\xbe\xbe");
|
||
std::cout << "[PASS] testOrderStatusString\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 运行所有测试。
|
||
*/
|
||
int main() {
|
||
testProduct();
|
||
testShoppingCart();
|
||
testOrder();
|
||
testOrderStatusString();
|
||
std::cout << "\n===== \xe5\x85\xa8\xe9\x83\xa8\xe6\xb5\x8b\xe8\xaf\x95\xe9\x80\x9a\xe8\xbf\x87! =====\n"; // 全部测试通过!
|
||
return 0;
|
||
}
|