116 lines
2.8 KiB
C++
116 lines
2.8 KiB
C++
#include <cassert>
|
||
#include <iostream>
|
||
#include <string>
|
||
#include "app.hpp"
|
||
|
||
/// @brief 测试图书管理系统核心功能
|
||
/// 使用标准库 assert,不依赖第三方测试框架。
|
||
static void testAddAndFind() {
|
||
std::cout << "[Test] testAddAndFind ... ";
|
||
App app;
|
||
assert(app.size() == 0);
|
||
|
||
Book b1{"书名A", "作者A", "ISBN-001"};
|
||
assert(app.addBook(b1));
|
||
assert(app.size() == 1);
|
||
|
||
// 重复 ISBN 应返回 false
|
||
Book b2{"书名B", "作者B", "ISBN-001"};
|
||
assert(!app.addBook(b2));
|
||
assert(app.size() == 1);
|
||
|
||
const Book* found = app.findByIsbn("ISBN-001");
|
||
assert(found != nullptr);
|
||
assert(found->getTitle() == "书名A");
|
||
assert(found->getAuthor() == "作者A");
|
||
|
||
// 不存在的 ISBN
|
||
assert(app.findByIsbn("ISBN-999") == nullptr);
|
||
std::cout << "PASSED\n";
|
||
}
|
||
|
||
/// @brief 测试删除功能
|
||
static void testRemove() {
|
||
std::cout << "[Test] testRemove ... ";
|
||
App app;
|
||
app.addBook(Book{"A", "a", "X"});
|
||
app.addBook(Book{"B", "b", "Y"});
|
||
assert(app.size() == 2);
|
||
|
||
// 删除存在的
|
||
assert(app.removeBook("X"));
|
||
assert(app.size() == 1);
|
||
|
||
// 删除不存在的
|
||
assert(!app.removeBook("Z"));
|
||
assert(app.size() == 1);
|
||
|
||
std::cout << "PASSED\n";
|
||
}
|
||
|
||
/// @brief 测试搜索功能(不区分大小写)
|
||
static void testSearch() {
|
||
std::cout << "[Test] testSearch ... ";
|
||
App app;
|
||
app.addBook(Book{"C++ Primer", "Stanley Lippman", "I1"});
|
||
app.addBook(Book{"Effective Modern C++", "Scott Meyers", "I2"});
|
||
app.addBook(Book{"设计模式", "GoF", "I3"});
|
||
|
||
// 按书名搜索(不区分大小写)
|
||
auto r1 = app.search("c++");
|
||
assert(r1.size() == 2);
|
||
|
||
// 按作者搜索
|
||
auto r2 = app.search("stanley");
|
||
assert(r2.size() == 1);
|
||
assert(r2[0].getIsbn() == "I1");
|
||
|
||
// 无匹配
|
||
auto r3 = app.search("不存在的书");
|
||
assert(r3.empty());
|
||
|
||
std::cout << "PASSED\n";
|
||
}
|
||
|
||
/// @brief 测试借出和归还
|
||
static void testBorrowReturn() {
|
||
std::cout << "[Test] testBorrowReturn ... ";
|
||
App app;
|
||
app.addBook(Book{"A", "a", "I-A"});
|
||
|
||
// 借出
|
||
assert(app.borrowBook("I-A"));
|
||
const Book* b = app.findByIsbn("I-A");
|
||
assert(b != nullptr);
|
||
assert(b->isBorrowed());
|
||
|
||
// 重复借出应失败
|
||
assert(!app.borrowBook("I-A"));
|
||
|
||
// 归还
|
||
assert(app.returnBook("I-A"));
|
||
assert(!b->isBorrowed());
|
||
|
||
// 重复归还应失败
|
||
assert(!app.returnBook("I-A"));
|
||
|
||
// 不存在的 ISBN
|
||
assert(!app.borrowBook("I-NONE"));
|
||
assert(!app.returnBook("I-NONE"));
|
||
|
||
std::cout << "PASSED\n";
|
||
}
|
||
|
||
/// @brief 主测试入口
|
||
int main() {
|
||
std::cout << "===== 图书管理系统单元测试 =====\n\n";
|
||
|
||
testAddAndFind();
|
||
testRemove();
|
||
testSearch();
|
||
testBorrowReturn();
|
||
|
||
std::cout << "\n✅ 所有测试通过!\n";
|
||
return 0;
|
||
}
|