parent
811868dfc4
commit
880af85d43
@ -0,0 +1,110 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:background="#FFFFFF">
|
||||
|
||||
<!-- 顶部标题栏 -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:padding="12dp"
|
||||
android:background="#4CAF50"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<Button
|
||||
android:id="@+id/btnBack"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="返回"
|
||||
android:textColor="#FFFFFF"
|
||||
android:background="?android:attr/selectableItemBackground" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTitle"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="🤖 SLMS智能助手"
|
||||
android:textSize="18sp"
|
||||
android:textColor="#FFFFFF"
|
||||
android:gravity="center"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<View
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="1dp" />
|
||||
</LinearLayout>
|
||||
|
||||
<!-- 快捷操作按钮 -->
|
||||
<HorizontalScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:scrollbars="none"
|
||||
android:background="#F5F5F5">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/quickActionsLayout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:padding="8dp" />
|
||||
</HorizontalScrollView>
|
||||
|
||||
<!-- 聊天内容区域 -->
|
||||
<ScrollView
|
||||
android:id="@+id/scrollView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:fillViewport="true">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/chatContainer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp" />
|
||||
</ScrollView>
|
||||
|
||||
<!-- 输入区域 -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:padding="8dp"
|
||||
android:background="#F5F5F5"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etInput"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:hint="输入问题或点击麦克风语音输入..."
|
||||
android:padding="12dp"
|
||||
android:background="@android:drawable/edit_text"
|
||||
android:maxLines="3" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btnVoice"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:src="@android:drawable/ic_btn_speak_now"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="语音输入" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btnSend"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="4dp"
|
||||
android:src="@android:drawable/ic_menu_send"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="发送" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@ -0,0 +1,160 @@
|
||||
package com.smartlibrary.android.ai;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* SimpleAIService单元测试
|
||||
*/
|
||||
public class SimpleAIServiceTest {
|
||||
|
||||
private SimpleAIService aiService;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
aiService = SimpleAIService.getInstance();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSingletonInstance() {
|
||||
SimpleAIService instance1 = SimpleAIService.getInstance();
|
||||
SimpleAIService instance2 = SimpleAIService.getInstance();
|
||||
assertSame(instance1, instance2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatNullInput() {
|
||||
String response = aiService.chat(null);
|
||||
assertNotNull(response);
|
||||
assertEquals("请输入您的问题。", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatEmptyInput() {
|
||||
String response = aiService.chat("");
|
||||
assertNotNull(response);
|
||||
assertEquals("请输入您的问题。", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatWhitespaceInput() {
|
||||
String response = aiService.chat(" ");
|
||||
assertNotNull(response);
|
||||
assertEquals("请输入您的问题。", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatBorrowIntent() {
|
||||
String response = aiService.chat("如何借书");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("借阅"));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testChatReturnIntent() {
|
||||
String response = aiService.chat("怎么还书");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("归还"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatSearchIntent() {
|
||||
String response = aiService.chat("搜索图书");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("搜索"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatRecommendIntent() {
|
||||
String response = aiService.chat("推荐一些好书");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("推荐"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatHelpIntent() {
|
||||
String response = aiService.chat("帮助");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("帮"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatUnknownIntent() {
|
||||
String response = aiService.chat("随便说点什么");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.length() > 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmartSearchNullQuery() {
|
||||
String response = aiService.smartSearch(null);
|
||||
assertNotNull(response);
|
||||
assertEquals("请输入搜索关键词", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmartSearchEmptyQuery() {
|
||||
String response = aiService.smartSearch("");
|
||||
assertNotNull(response);
|
||||
assertEquals("请输入搜索关键词", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmartSearchValidQuery() {
|
||||
String response = aiService.smartSearch("Java编程");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("智能搜索"));
|
||||
assertTrue(response.contains("Java编程"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRecommendation() {
|
||||
String response = aiService.getRecommendation("U001");
|
||||
assertNotNull(response);
|
||||
assertTrue(response.contains("推荐"));
|
||||
assertTrue(response.contains("U001"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRecommendationContainsBooks() {
|
||||
String response = aiService.getRecommendation("testUser");
|
||||
assertNotNull(response);
|
||||
// 验证包含推荐的图书
|
||||
assertTrue(response.contains("深入理解计算机系统") ||
|
||||
response.contains("算法导论") ||
|
||||
response.contains("设计模式"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatBorrowKeywords() {
|
||||
// 测试各种借阅相关关键词
|
||||
String[] borrowKeywords = {"借", "borrow", "租", "借书"};
|
||||
for (String keyword : borrowKeywords) {
|
||||
String response = aiService.chat(keyword);
|
||||
assertNotNull(response);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatReturnKeywords() {
|
||||
// 测试各种归还相关关键词
|
||||
String[] returnKeywords = {"还", "return", "归还", "还书"};
|
||||
for (String keyword : returnKeywords) {
|
||||
String response = aiService.chat(keyword);
|
||||
assertNotNull(response);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChatSearchKeywords() {
|
||||
// 测试各种搜索相关关键词
|
||||
String[] searchKeywords = {"搜索", "search", "找", "查找", "查询"};
|
||||
for (String keyword : searchKeywords) {
|
||||
String response = aiService.chat(keyword);
|
||||
assertNotNull(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,178 @@
|
||||
package com.smartlibrary.android.factory;
|
||||
|
||||
import com.smartlibrary.android.model.Book;
|
||||
import com.smartlibrary.android.model.Loan;
|
||||
import com.smartlibrary.android.model.User;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* LibraryObjectFactory工厂类单元测试
|
||||
*/
|
||||
public class LibraryObjectFactoryTest {
|
||||
|
||||
@Test
|
||||
public void testCreateBook() {
|
||||
Book book = LibraryObjectFactory.createBook(
|
||||
"Java编程思想", "Bruce Eckel", "978-7-111-21382-6", "编程语言");
|
||||
|
||||
assertNotNull(book);
|
||||
assertNotNull(book.getId());
|
||||
assertTrue(book.getId().startsWith("B-"));
|
||||
assertEquals("Java编程思想", book.getTitle());
|
||||
assertEquals("Bruce Eckel", book.getAuthor());
|
||||
assertEquals("978-7-111-21382-6", book.getIsbn());
|
||||
assertEquals("编程语言", book.getCategory());
|
||||
assertEquals("available", book.getStatus());
|
||||
assertNotNull(book.getCreatedAt());
|
||||
assertNotNull(book.getUpdatedAt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateBookWithId() {
|
||||
Book book = LibraryObjectFactory.createBook(
|
||||
"B001", "设计模式", "Erich Gamma", "978-7-111-07575-6", "软件工程", "borrowed");
|
||||
|
||||
assertNotNull(book);
|
||||
assertEquals("B001", book.getId());
|
||||
assertEquals("设计模式", book.getTitle());
|
||||
assertEquals("Erich Gamma", book.getAuthor());
|
||||
assertEquals("978-7-111-07575-6", book.getIsbn());
|
||||
assertEquals("软件工程", book.getCategory());
|
||||
assertEquals("borrowed", book.getStatus());
|
||||
}
|
||||
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateBookNullTitle() {
|
||||
LibraryObjectFactory.createBook(null, "Author", "ISBN", "Category");
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateBookEmptyTitle() {
|
||||
LibraryObjectFactory.createBook("", "Author", "ISBN", "Category");
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateBookNullAuthor() {
|
||||
LibraryObjectFactory.createBook("Title", null, "ISBN", "Category");
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateBookEmptyAuthor() {
|
||||
LibraryObjectFactory.createBook("Title", " ", "ISBN", "Category");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateBookTrimsWhitespace() {
|
||||
Book book = LibraryObjectFactory.createBook(
|
||||
" Java编程思想 ", " Bruce Eckel ", " 978-7-111-21382-6 ", " 编程语言 ");
|
||||
|
||||
assertEquals("Java编程思想", book.getTitle());
|
||||
assertEquals("Bruce Eckel", book.getAuthor());
|
||||
assertEquals("978-7-111-21382-6", book.getIsbn());
|
||||
assertEquals("编程语言", book.getCategory());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateUser() {
|
||||
User user = LibraryObjectFactory.createUser("张三", "zhangsan@example.com", "13800138000");
|
||||
|
||||
assertNotNull(user);
|
||||
assertNotNull(user.getId());
|
||||
assertTrue(user.getId().startsWith("U-"));
|
||||
assertEquals("张三", user.getName());
|
||||
assertEquals("zhangsan@example.com", user.getEmail());
|
||||
assertEquals("13800138000", user.getPhone());
|
||||
assertNotNull(user.getCreatedAt());
|
||||
assertNotNull(user.getUpdatedAt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateUserWithId() {
|
||||
User user = LibraryObjectFactory.createUser("U001", "李四", "lisi@example.com", "13900139000");
|
||||
|
||||
assertNotNull(user);
|
||||
assertEquals("U001", user.getId());
|
||||
assertEquals("李四", user.getName());
|
||||
assertEquals("lisi@example.com", user.getEmail());
|
||||
assertEquals("13900139000", user.getPhone());
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateUserNullName() {
|
||||
LibraryObjectFactory.createUser(null, "email@example.com", "13800138000");
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateUserEmptyEmail() {
|
||||
LibraryObjectFactory.createUser("Name", "", "13800138000");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateLoan() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 30);
|
||||
Date dueDate = cal.getTime();
|
||||
|
||||
Loan loan = LibraryObjectFactory.createLoan("U001", "B001", dueDate);
|
||||
|
||||
assertNotNull(loan);
|
||||
assertNotNull(loan.getId());
|
||||
assertTrue(loan.getId().startsWith("L-"));
|
||||
assertEquals("U001", loan.getUserId());
|
||||
assertEquals("B001", loan.getBookId());
|
||||
assertNotNull(loan.getLoanDate());
|
||||
assertEquals(dueDate, loan.getDueDate());
|
||||
assertEquals("active", loan.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateLoanWithId() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Date loanDate = cal.getTime();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 30);
|
||||
Date dueDate = cal.getTime();
|
||||
|
||||
Loan loan = LibraryObjectFactory.createLoan(
|
||||
"L001", "U001", "B001", loanDate, dueDate, "active");
|
||||
|
||||
assertNotNull(loan);
|
||||
assertEquals("L001", loan.getId());
|
||||
assertEquals("U001", loan.getUserId());
|
||||
assertEquals("B001", loan.getBookId());
|
||||
assertEquals(loanDate, loan.getLoanDate());
|
||||
assertEquals(dueDate, loan.getDueDate());
|
||||
assertEquals("active", loan.getStatus());
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateLoanNullUserId() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 30);
|
||||
LibraryObjectFactory.createLoan(null, "B001", cal.getTime());
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testCreateLoanNullDueDate() {
|
||||
LibraryObjectFactory.createLoan("U001", "B001", null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGeneratedIdsAreUnique() {
|
||||
Book book1 = LibraryObjectFactory.createBook("Title1", "Author1", "ISBN1", "Cat1");
|
||||
Book book2 = LibraryObjectFactory.createBook("Title2", "Author2", "ISBN2", "Cat2");
|
||||
|
||||
assertNotEquals(book1.getId(), book2.getId());
|
||||
|
||||
User user1 = LibraryObjectFactory.createUser("Name1", "email1@test.com", "111");
|
||||
User user2 = LibraryObjectFactory.createUser("Name2", "email2@test.com", "222");
|
||||
|
||||
assertNotEquals(user1.getId(), user2.getId());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,144 @@
|
||||
package com.smartlibrary.android.model;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Book模型类单元测试
|
||||
*/
|
||||
public class BookTest {
|
||||
|
||||
private Book book;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
book = new Book("B001", "Java编程思想", "Bruce Eckel",
|
||||
"978-7-111-21382-6", "编程语言", "available");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructor() {
|
||||
assertNotNull(book);
|
||||
assertEquals("B001", book.getId());
|
||||
assertEquals("Java编程思想", book.getTitle());
|
||||
assertEquals("Bruce Eckel", book.getAuthor());
|
||||
assertEquals("978-7-111-21382-6", book.getIsbn());
|
||||
assertEquals("编程语言", book.getCategory());
|
||||
assertEquals("available", book.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultConstructor() {
|
||||
Book emptyBook = new Book();
|
||||
assertNotNull(emptyBook);
|
||||
assertNull(emptyBook.getId());
|
||||
assertNull(emptyBook.getTitle());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettersAndGetters() {
|
||||
book.setId("B002");
|
||||
assertEquals("B002", book.getId());
|
||||
|
||||
book.setTitle("设计模式");
|
||||
assertEquals("设计模式", book.getTitle());
|
||||
|
||||
book.setAuthor("Erich Gamma");
|
||||
assertEquals("Erich Gamma", book.getAuthor());
|
||||
|
||||
book.setIsbn("978-7-111-07575-6");
|
||||
assertEquals("978-7-111-07575-6", book.getIsbn());
|
||||
|
||||
book.setCategory("软件工程");
|
||||
assertEquals("软件工程", book.getCategory());
|
||||
|
||||
book.setStatus("borrowed");
|
||||
assertEquals("borrowed", book.getStatus());
|
||||
|
||||
book.setPublisher("机械工业出版社");
|
||||
assertEquals("机械工业出版社", book.getPublisher());
|
||||
|
||||
book.setDescription("经典设计模式书籍");
|
||||
assertEquals("经典设计模式书籍", book.getDescription());
|
||||
|
||||
book.setLocation("A区-1架-2层");
|
||||
assertEquals("A区-1架-2层", book.getLocation());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsAvailable() {
|
||||
book.setStatus("available");
|
||||
assertTrue(book.isAvailable());
|
||||
|
||||
book.setStatus("AVAILABLE");
|
||||
assertTrue(book.isAvailable());
|
||||
|
||||
book.setStatus("borrowed");
|
||||
assertFalse(book.isAvailable());
|
||||
|
||||
book.setStatus("reserved");
|
||||
assertFalse(book.isAvailable());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQrCode() {
|
||||
assertNotNull(book.getQrCode());
|
||||
assertTrue(book.getQrCode().contains("MCSLMS:BOOK:"));
|
||||
assertTrue(book.getQrCode().contains("B001"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEnsureQrCode() {
|
||||
Book newBook = new Book();
|
||||
newBook.setId("B003");
|
||||
newBook.setQrCode(null);
|
||||
|
||||
newBook.ensureQrCode();
|
||||
assertNotNull(newBook.getQrCode());
|
||||
assertEquals("MCSLMS:BOOK:B003", newBook.getQrCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEnsureQrCodeWithExisting() {
|
||||
String existingQr = "CUSTOM:QR:CODE";
|
||||
book.setQrCode(existingQr);
|
||||
book.ensureQrCode();
|
||||
assertEquals(existingQr, book.getQrCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDescriptionDefault() {
|
||||
Book newBook = new Book();
|
||||
newBook.setAuthor("Test Author");
|
||||
assertEquals("A book by Test Author", newBook.getDescription());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDescriptionCustom() {
|
||||
book.setDescription("自定义描述");
|
||||
assertEquals("自定义描述", book.getDescription());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDates() {
|
||||
Date now = new Date();
|
||||
book.setCreatedAt(now);
|
||||
book.setUpdatedAt(now);
|
||||
|
||||
assertEquals(now, book.getCreatedAt());
|
||||
assertEquals(now, book.getUpdatedAt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToString() {
|
||||
String str = book.toString();
|
||||
assertNotNull(str);
|
||||
assertTrue(str.contains("B001"));
|
||||
assertTrue(str.contains("Java编程思想"));
|
||||
assertTrue(str.contains("Bruce Eckel"));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,201 @@
|
||||
package com.smartlibrary.android.model;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Loan模型类单元测试
|
||||
*/
|
||||
public class LoanTest {
|
||||
|
||||
private Loan loan;
|
||||
private Date loanDate;
|
||||
private Date dueDate;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
loanDate = cal.getTime();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 30);
|
||||
dueDate = cal.getTime();
|
||||
|
||||
loan = new Loan("L001", "U001", "B001", loanDate, dueDate, "active");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructor() {
|
||||
assertNotNull(loan);
|
||||
assertEquals("L001", loan.getId());
|
||||
assertEquals("U001", loan.getUserId());
|
||||
assertEquals("B001", loan.getBookId());
|
||||
assertEquals(loanDate, loan.getLoanDate());
|
||||
assertEquals(dueDate, loan.getDueDate());
|
||||
assertEquals("active", loan.getStatus());
|
||||
assertNull(loan.getReturnDate());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultConstructor() {
|
||||
Loan emptyLoan = new Loan();
|
||||
assertNotNull(emptyLoan);
|
||||
assertNull(emptyLoan.getId());
|
||||
assertNull(emptyLoan.getUserId());
|
||||
assertNull(emptyLoan.getBookId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettersAndGetters() {
|
||||
loan.setId("L002");
|
||||
assertEquals("L002", loan.getId());
|
||||
|
||||
loan.setUserId("U002");
|
||||
assertEquals("U002", loan.getUserId());
|
||||
|
||||
loan.setBookId("B002");
|
||||
assertEquals("B002", loan.getBookId());
|
||||
|
||||
Date newLoanDate = new Date();
|
||||
loan.setLoanDate(newLoanDate);
|
||||
assertEquals(newLoanDate, loan.getLoanDate());
|
||||
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 14);
|
||||
Date newDueDate = cal.getTime();
|
||||
loan.setDueDate(newDueDate);
|
||||
assertEquals(newDueDate, loan.getDueDate());
|
||||
|
||||
Date returnDate = new Date();
|
||||
loan.setReturnDate(returnDate);
|
||||
assertEquals(returnDate, loan.getReturnDate());
|
||||
|
||||
loan.setStatus("returned");
|
||||
assertEquals("returned", loan.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBorrowDateAlias() {
|
||||
Date borrowDate = new Date();
|
||||
loan.setBorrowDate(borrowDate);
|
||||
assertEquals(borrowDate, loan.getBorrowDate());
|
||||
assertEquals(borrowDate, loan.getLoanDate());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsOverdueNotOverdue() {
|
||||
// 未逾期:到期日在未来
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 10);
|
||||
loan.setDueDate(cal.getTime());
|
||||
loan.setReturnDate(null);
|
||||
|
||||
assertFalse(loan.isOverdue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsOverdueOverdue() {
|
||||
// 逾期:到期日在过去
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, -5);
|
||||
loan.setDueDate(cal.getTime());
|
||||
loan.setReturnDate(null);
|
||||
|
||||
assertTrue(loan.isOverdue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsOverdueAlreadyReturned() {
|
||||
// 已归还:不算逾期
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, -5);
|
||||
loan.setDueDate(cal.getTime());
|
||||
loan.setReturnDate(new Date());
|
||||
|
||||
assertFalse(loan.isOverdue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsOverdueNullDueDate() {
|
||||
loan.setDueDate(null);
|
||||
loan.setReturnDate(null);
|
||||
|
||||
assertFalse(loan.isOverdue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanRenew() {
|
||||
// 可续借:未归还且未逾期
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, 10);
|
||||
loan.setDueDate(cal.getTime());
|
||||
loan.setReturnDate(null);
|
||||
|
||||
assertTrue(loan.canRenew());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanRenewAlreadyReturned() {
|
||||
// 不可续借:已归还
|
||||
loan.setReturnDate(new Date());
|
||||
|
||||
assertFalse(loan.canRenew());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanRenewOverdue() {
|
||||
// 不可续借:已逾期
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.add(Calendar.DAY_OF_MONTH, -5);
|
||||
loan.setDueDate(cal.getTime());
|
||||
loan.setReturnDate(null);
|
||||
|
||||
assertFalse(loan.canRenew());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetBookTitle() {
|
||||
// 默认返回占位符
|
||||
assertEquals("Book Title", loan.getBookTitle());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetBookAuthor() {
|
||||
// 默认返回占位符
|
||||
assertEquals("Book Author", loan.getBookAuthor());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDates() {
|
||||
Date now = new Date();
|
||||
loan.setCreatedAt(now);
|
||||
loan.setUpdatedAt(now);
|
||||
|
||||
assertEquals(now, loan.getCreatedAt());
|
||||
assertEquals(now, loan.getUpdatedAt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToString() {
|
||||
String str = loan.toString();
|
||||
assertNotNull(str);
|
||||
assertTrue(str.contains("L001"));
|
||||
assertTrue(str.contains("U001"));
|
||||
assertTrue(str.contains("B001"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatusValues() {
|
||||
loan.setStatus("active");
|
||||
assertEquals("active", loan.getStatus());
|
||||
|
||||
loan.setStatus("returned");
|
||||
assertEquals("returned", loan.getStatus());
|
||||
|
||||
loan.setStatus("overdue");
|
||||
assertEquals("overdue", loan.getStatus());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,174 @@
|
||||
package com.smartlibrary.android.model;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* User模型类单元测试
|
||||
*/
|
||||
public class UserTest {
|
||||
|
||||
private User user;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
user = new User("U001", "张三", "zhangsan@example.com", "13800138000");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructorBasic() {
|
||||
assertNotNull(user);
|
||||
assertEquals("U001", user.getId());
|
||||
assertEquals("张三", user.getName());
|
||||
assertEquals("zhangsan@example.com", user.getEmail());
|
||||
assertEquals("13800138000", user.getPhone());
|
||||
assertEquals(User.ROLE_USER, user.getRole());
|
||||
assertTrue(user.isActive());
|
||||
assertEquals(5, user.getBorrowLimit());
|
||||
assertEquals(0, user.getCurrentBorrows());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructorWithRole() {
|
||||
User admin = new User("A001", "管理员", "admin@example.com", "13900139000", User.ROLE_ADMIN);
|
||||
assertEquals(User.ROLE_ADMIN, admin.getRole());
|
||||
assertEquals(20, admin.getBorrowLimit());
|
||||
|
||||
User librarian = new User("L001", "图书管理员", "lib@example.com", "13700137000", User.ROLE_LIBRARIAN);
|
||||
assertEquals(User.ROLE_LIBRARIAN, librarian.getRole());
|
||||
assertEquals(20, librarian.getBorrowLimit());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultConstructor() {
|
||||
User emptyUser = new User();
|
||||
assertNotNull(emptyUser);
|
||||
assertEquals(User.ROLE_USER, emptyUser.getRole());
|
||||
assertTrue(emptyUser.isActive());
|
||||
assertEquals(5, emptyUser.getBorrowLimit());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettersAndGetters() {
|
||||
user.setId("U002");
|
||||
assertEquals("U002", user.getId());
|
||||
|
||||
user.setName("李四");
|
||||
assertEquals("李四", user.getName());
|
||||
|
||||
user.setEmail("lisi@example.com");
|
||||
assertEquals("lisi@example.com", user.getEmail());
|
||||
|
||||
user.setPhone("13600136000");
|
||||
assertEquals("13600136000", user.getPhone());
|
||||
|
||||
user.setPassword("password123");
|
||||
assertEquals("password123", user.getPassword());
|
||||
|
||||
user.setRole(User.ROLE_ADMIN);
|
||||
assertEquals(User.ROLE_ADMIN, user.getRole());
|
||||
|
||||
user.setAvatar("http://example.com/avatar.jpg");
|
||||
assertEquals("http://example.com/avatar.jpg", user.getAvatar());
|
||||
|
||||
user.setActive(false);
|
||||
assertFalse(user.isActive());
|
||||
|
||||
user.setBorrowLimit(10);
|
||||
assertEquals(10, user.getBorrowLimit());
|
||||
|
||||
user.setCurrentBorrows(3);
|
||||
assertEquals(3, user.getCurrentBorrows());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsAdmin() {
|
||||
user.setRole(User.ROLE_ADMIN);
|
||||
assertTrue(user.isAdmin());
|
||||
|
||||
user.setRole(User.ROLE_USER);
|
||||
assertFalse(user.isAdmin());
|
||||
|
||||
user.setRole(User.ROLE_LIBRARIAN);
|
||||
assertFalse(user.isAdmin());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLibrarian() {
|
||||
user.setRole(User.ROLE_LIBRARIAN);
|
||||
assertTrue(user.isLibrarian());
|
||||
|
||||
user.setRole(User.ROLE_ADMIN);
|
||||
assertTrue(user.isLibrarian()); // Admin也是图书管理员
|
||||
|
||||
user.setRole(User.ROLE_USER);
|
||||
assertFalse(user.isLibrarian());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanBorrowMore() {
|
||||
user.setActive(true);
|
||||
user.setBorrowLimit(5);
|
||||
user.setCurrentBorrows(3);
|
||||
assertTrue(user.canBorrowMore());
|
||||
|
||||
user.setCurrentBorrows(5);
|
||||
assertFalse(user.canBorrowMore());
|
||||
|
||||
user.setCurrentBorrows(3);
|
||||
user.setActive(false);
|
||||
assertFalse(user.canBorrowMore());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRoleDisplayName() {
|
||||
user.setRole(User.ROLE_ADMIN);
|
||||
assertEquals("系统管理员", user.getRoleDisplayName());
|
||||
|
||||
user.setRole(User.ROLE_LIBRARIAN);
|
||||
assertEquals("图书管理员", user.getRoleDisplayName());
|
||||
|
||||
user.setRole(User.ROLE_USER);
|
||||
assertEquals("普通用户", user.getRoleDisplayName());
|
||||
|
||||
user.setRole(User.ROLE_GUEST);
|
||||
assertEquals("访客", user.getRoleDisplayName());
|
||||
|
||||
user.setRole(null);
|
||||
assertEquals("普通用户", user.getRoleDisplayName());
|
||||
|
||||
user.setRole("unknown");
|
||||
assertEquals("普通用户", user.getRoleDisplayName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRoleConstants() {
|
||||
assertEquals("admin", User.ROLE_ADMIN);
|
||||
assertEquals("librarian", User.ROLE_LIBRARIAN);
|
||||
assertEquals("user", User.ROLE_USER);
|
||||
assertEquals("guest", User.ROLE_GUEST);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDates() {
|
||||
Date now = new Date();
|
||||
user.setCreatedAt(now);
|
||||
user.setUpdatedAt(now);
|
||||
|
||||
assertEquals(now, user.getCreatedAt());
|
||||
assertEquals(now, user.getUpdatedAt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToString() {
|
||||
String str = user.toString();
|
||||
assertNotNull(str);
|
||||
assertTrue(str.contains("U001"));
|
||||
assertTrue(str.contains("张三"));
|
||||
assertTrue(str.contains("zhangsan@example.com"));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue