shangcheng/tests/basic_test.cpp

126 lines
3.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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;
}