# Lab1 Code
###### tags: `CTBC-Lab1` `CTBC`
:::spoiler
```java
```
:::
## src/main/java
### com.ctbcbank.boot.lab1
:::spoiler Lab1Application
```java
package com.ctbc.boot.lab1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Lab1Application {
public static void main(String[] args) {
SpringApplication.run(Lab1Application.class, args);
}
}
```
:::
### com.ctbcbank.boot.lab1.model
:::spoiler Course
```java
package com.ctbc.boot.lab1.model;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Course {
private UUID courseId; // 識別碼
private String courseName; // 課程名稱
private int coursePrice; // 價錢
private String courseTeacher; // 授課老師
private CourseCategory courseCategory;
public Course(String courseName, int coursePrice, String courseTeacher,
CourseCategory courseCategory) {
super();
this.courseId = UUID.randomUUID();
this.courseName = courseName;
this.coursePrice = coursePrice;
this.courseTeacher = courseTeacher;
this.courseCategory = courseCategory;
}
@Override
public String toString() {
return "Course {courseId=[" + courseId + "], courseName=[" + courseName + "], coursePrice=[" + coursePrice
+ "], courseTeacher=[" + courseTeacher + "], courseCategory=[" + courseCategory + "]}";
}
// public Course(String courseName, int coursePrice, String courseTeacher) {
// this.courseId = UUID.randomUUID().toString();
// this.courseName = courseName;
// this.coursePrice = coursePrice;
// this.courseTeacher = courseTeacher;
// }
}
}
```
:::
:::spoiler CourseCategory
```java
package com.ctbc.boot.lab1.model;
import java.util.ArrayList;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor //無參建構子
@AllArgsConstructor //有參建構子
public class CourseCategory {
// 無參/有參建構子
// public CourseCategory(){
//
// }
// CourseCategory(String categoryID , String categoryName ,String detail){
// this.categoryID =categoryID;
// this.categoryName = categoryName;
// this.detail = detail;
// }
// 屬性
private UUID categoryID; // 類別的識別碼
private String categoryName; // 名稱
private String detail; // 細節
private ArrayList<Course> courseList;
// 建構子
public CourseCategory(String categoryName, String detail) {
this.categoryID = UUID.randomUUID(); // 改UUID
this.categoryName = categoryName;
this.detail = detail;
this.courseList = courseList;
}
public void AddCourseToCategory(Course course){
this.courseList = new ArrayList<>(); // ??
this.courseList.add(course);
}
@Override
public String toString() {
return "CourseCategory {categoryID=[" + categoryID + "], categoryName=[" + categoryName + "], detail=[" + detail
+ "]}";
}
}
```
:::
### com.ctbcbank.boot.lab1.service
:::spoiler CourseCategoryService
```java
package com.ctbc.boot.lab1.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.ctbc.boot.lab1.model.CourseCategory;
public interface CourseCategoryService {
public static ArrayList<CourseCategory> categories = new ArrayList<CourseCategory>();
public static Map<UUID, CourseCategory> categoryMap = new HashMap<>();
// 列出所有的課程
ArrayList<CourseCategory> getAllCategory();
// 依照屬性新增課程,並且傳回課程??
CourseCategory addCategory(String categoryName, String detail);
// 依照鍵值刪除課程
CourseCategory removeCategory(UUID categoryID,CourseCategory coursecategory);
// 依照鍵值與新的值修改,並且傳回修改後的課程
CourseCategory updateCategory(String categoryID,String newName, String categoryName, String detail);
}
```
:::
:::spoiler CourseCategoryServiceJDKImplement
```java
package com.ctbc.boot.lab1.service;
// 2.2.1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.ctbc.boot.lab1.model.CourseCategory;
public class CourseCategoryServiceJDKImplement implements CourseCategoryService {
private Map<UUID, CourseCategory> categoryMap = new HashMap<>();
public CourseCategoryServiceJDKImplement() {
this.categoryMap = new HashMap<>();
}
@Override
public ArrayList<CourseCategory> getAllCategory() {
return categories;
}
// 2.1.1.2
@Override
public CourseCategory addCategory(String categoryName, String detail) {
CourseCategory category = new CourseCategory(categoryName, detail);
categories.add(category);
categoryMap.put(category.getCategoryID(), category);
return category;
}
@Override
public CourseCategory removeCategory(UUID categoryID,CourseCategory coursecategory) {
CourseCategory category = categoryMap.get(categoryID);
if (category != null) {
categories.remove(category);
categoryMap.remove(categoryID);
}
return category;
}
@Override
public CourseCategory updateCategory(String categoryID, String newName, String categoryName, String detail) {
CourseCategory category = categoryMap.get(categoryID);
if (category != null) {
if (newName != null) {
category.setCategoryName(categoryName);
categoryMap.remove(categoryID); // 移除舊課程
categoryMap.put(category.getCategoryID(), category);
}
if (detail != null) { // 為什麼要用大寫的Integer??
category.setDetail(detail);
}
}
return category;
}
// Exception
public class CategoryIdNotFound extends Exception {
public CategoryIdNotFound(String message) {
super(message);
}
}
public CourseCategory getCategoryById(String categoryId) throws CategoryIdNotFound {
CourseCategory category = categoryMap.get(categoryId);
if (category == null) {
throw new CategoryIdNotFound("Category ID not found: " + categoryId);
}
return category;
}
}
```
:::
:::spoiler CourseService
```java
package com.ctbc.boot.lab1.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.springframework.stereotype.Service;
import com.ctbc.boot.lab1.model.Course;
import com.ctbc.boot.lab1.model.CourseCategory;
import com.ctbc.boot.lab1.service.CourseServiceJDKImplement.CourseNameDuplicate;
@Service
public interface CourseService {
public static ArrayList<Course> courses = new ArrayList<Course>();
public static Map<UUID, Course> courseMap = new HashMap<>(); // UUID, Course
/*
建構子??
CourseService() {
courses = new ArrayList<>();
courseMap = new HashMap<>();
}
*/
// 列出所有的課程
ArrayList<Course> getAllCourses();
// 依照屬性新增課程,並且傳回課程??
Course addCourse(String courseName, int coursePrice, String courseTeacher, CourseCategory coursecategory) throws CourseNameDuplicate;
// 依照鍵值刪除課程
Course removeCourse(UUID courseId,Course course);
// 依照鍵值與新的值修改,並且傳回修改後的課程
Course updateCourse(UUID courseId,String newName, Integer newPrice, String newTeacher,CourseCategory coursecategory);
Course testcourseMapget(String courseName);
}
```
:::
:::spoiler CourseServiceJDKImplement
```java
package com.ctbc.boot.lab1.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.ctbc.boot.lab1.model.Course;
import com.ctbc.boot.lab1.model.CourseCategory;
import com.ctbc.boot.lab1.service.CourseCategoryServiceJDKImplement.CategoryIdNotFound;
public class CourseServiceJDKImplement implements CourseService {
public ArrayList<Course> courses;
public Map<UUID, Course> courseMap;
// 建構子?? // 應該要在哪邊初始化才對??
public CourseServiceJDKImplement() {
this.courses = new ArrayList<>();
this.courseMap = new HashMap<>();
}
// 查詢全部
@Override
public ArrayList<Course> getAllCourses() {
// Course course2 = new Course("Java",100,"Mark",(new CourseCategory("Java", "Programming")));
// courses.add(course2);
// courseMap.put("Java", course2);
return courses;
}
// 新增
@Override
public Course addCourse(String courseName, int coursePrice, String courseTeacher, CourseCategory coursecategory)
throws CourseNameDuplicate {
for (Course c : courses) {
if (c.getCourseName().contains(courseName)) {
System.out.println("courseName重複");
throw new CourseNameDuplicate("CourseName already exist: " + courseName);
}
}
// String categoryName = coursecategory.getCategoryName();
Course course = new Course(courseName, coursePrice, courseTeacher, coursecategory);
coursecategory.AddCourseToCategory(course); //
System.out.println("coursecategory : " + coursecategory.getCourseList().toString());
courses.add(course);
courseMap.put(course.getCourseId(), course); // ex : "Java", course類別
return course;
// String categoryName = coursecategory.getCategoryName();
// Course course = new Course(courseName, coursePrice, courseTeacher,coursecategory);
// courses.add(course);
// courseMap.put(course.getCourseName(), course); // ex : "Java", course類別
}
// 刪除
@Override
public Course removeCourse(UUID courseId, Course course) {
// Course course2 = new Course("Java",100,"Mark",(new CourseCategory("Java", "Programming")));
// courses.add(course2);
// courseMap.put("Java", course2);
// Course course = courseMap.get(courseId);
// System.out.println(course.toString());
// course.setCourseId(null);
if (courseMap.containsKey(courseId) && course.getCourseId() == courseId) {
courses.remove(course);
courseMap.remove(course.getCourseId());
}
return course;
}
// 修改
@Override
public Course updateCourse(UUID courseId, String newName, Integer newPrice, String newTeacher,
CourseCategory coursecategory) {
// Course course2 = new Course("Java",100,"Mark",(new CourseCategory("Java", "Programming")));
// courses.add(course2);
// courseMap.put("Java", course2);
// Course course = courseMap.get(courseName); // 拿出一堂課程類別
// System.out.println("course : " + course);
// UUID courseId = course.getCourseId(); // 拿到該類別的ID
// System.out.println("courseId : " + courseId + "[使用course.setCourseId(null)模擬Id為null的錯誤]");
// System.out.println("courseId1 : " + courseId + " [改掉courseI,測試UUID錯誤時修改傳回為空]");
// course.setCourseId(UUID.randomUUID()); // 2.2.2.4
// System.out.println("courseId2 : " + courseMap.get(courseName).getCourseId());
for (Course c : courses) {
// System.out.println("c : " + c.toString());
if (c.getCourseId().equals(courseId)) {
// System.out.println(c.toString());
if (courseId != null) {
if (c != null) {
if (newName != null) {
c.setCourseName(newName);
courseMap.remove(courseId); // 移除舊課程
courseMap.put(courseId, c);
}
if (newPrice != null) { // 為什麼要用大寫的Integer??
c.setCoursePrice(newPrice);
}
if (newTeacher != null) {
c.setCourseTeacher(newTeacher);
}
}
return c;
}
} else {
return null;
}
}
return null;
}
// Exception
public class CourseNameDuplicate extends Exception {
public CourseNameDuplicate(String message) {
super(message);
}
}
@Override
public Course testcourseMapget(String courseName) {
Course course = new Course("Java", 100, "Mark", (new CourseCategory("Java", "Programming")));
courseMap.put(course.getCourseId(), course);
Course course2 = courseMap.get(courseName); // 拿出一堂課程類別
return course2;
}
}
```
:::
## src/test/java
### com.ctbcbank.boot.lab1
:::spoiler Lab1ApplicationTests
```java
package com.ctbc.boot.lab1;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Lab1ApplicationTests {
@Test
void contextLoads() {
}
}
```
:::
### com.ctbcbank.boot.lab1.lab3
:::spoiler CourseCategoryTest
```java
package com.ctbc.boot.lab1.lab3;
//Test
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.ArrayList;
import java.util.Locale.Category;
import org.junit.jupiter.api.Test;
import com.ctbc.boot.lab1.model.CourseCategory;
import com.ctbc.boot.lab1.service.CourseCategoryService;
import com.ctbc.boot.lab1.service.CourseCategoryServiceJDKImplement;
//import static
import static org.assertj.core.api.Assertions.assertThat;
public class CourseCategoryTest {
private CourseCategoryServiceJDKImplement categoryService;
@BeforeEach
public void setup() {
this.categoryService = new CourseCategoryServiceJDKImplement(); // 要加上BeforeEach
}
//private CourseCategoryService service;
@Test
public void testGetAllCategory() {
ArrayList<CourseCategory> categories = this.categoryService.getAllCategory();
Assertions.assertNotNull(categories);
Assertions.assertTrue(categories.isEmpty());
}
@Test
public void testAddCategory() {
String categoryName = "Programming";
String detail = "Computer Technical";
CourseCategory coursecategory = this.categoryService.addCategory(categoryName, detail);
CourseCategory coursecategory2 = this.categoryService.addCategory("Web", "Angular");
System.out.println(coursecategory.toString());
System.out.println(coursecategory2.toString());
// Assertions.assertNotNull(coursecategory);
// Assertions.assertEquals(categoryName,coursecategory.getCategoryName());
this.categoryService.categories.get(0).setCategoryID(null);
System.out.println(coursecategory.toString());
}
}
```
:::
:::spoiler CourseServiceTest
```java
package com.ctbc.boot.lab1.lab3;
import java.util.ArrayList;
import java.util.UUID;
import javax.sound.midi.Soundbank;
//Test
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
import static org.assertj.core.api.Assertions.from;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
//MockMvc
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import static org.mockito.Mockito.when;
//
import com.ctbc.boot.lab1.model.Course;
import com.ctbc.boot.lab1.model.CourseCategory;
import com.ctbc.boot.lab1.service.CourseService;
import com.ctbc.boot.lab1.service.CourseServiceJDKImplement;
import com.ctbc.boot.lab1.service.CourseServiceJDKImplement.CourseNameDuplicate;
import net.bytebuddy.asm.Advice.This;
public class CourseServiceTest {
private CourseServiceJDKImplement courseService;
@BeforeEach
public void setup() {
this.courseService = new CourseServiceJDKImplement();
}
// private CourseService service;
// 查詢全部
//@Test
@Order(1)
public void testGetAllCourses() {
ArrayList<Course> courses = this.courseService.getAllCourses(); // 為什麼要this.
System.out.println("\n1. testGetAllCourses (3.1 服務生成時可以取出所有的但是是為空)");
System.out.println(courses.toString() + "\n");
Assertions.assertNotNull(courses); // expected: <null> but was: <[]>
Assertions.assertTrue(courses.isEmpty());
//Assertions.fail("錯誤");
}
// 新增
//@Test
@Order(2)
public void testAddCourse() throws CourseNameDuplicate {
System.out.println("\n2. testAddCourse");
String courseName = "Java";
int coursePrice = 100;
String courseTeacher = "Mark";
CourseCategory coursecategory = new CourseCategory("Java", "Programming");
//3.3 測試加入多筆之後比較內容
Course course = this.courseService.addCourse(courseName, coursePrice, courseTeacher, coursecategory);
//---------------------------------------------------------------------------------------
System.out.println("加入1筆");
System.out.println("courses = \n" + course.toString());
System.out.println("\ncourseMap = \n" + this.courseService.courseMap.toString());
Assertions.assertNotNull(course);
Assertions.assertEquals(courseName, course.getCourseName());
Assertions.assertEquals(this.courseService.courses.size(), 1);
//---------------------------------------------------------------------------------------
Course course3 = this.courseService.addCourse("Spring", 300, "Kevin", (new CourseCategory("Java", "Programming")));
Assertions.assertEquals(this.courseService.courses.size(), 2);
// 5.1 課程名稱重複的例外
// Course course = this.courseService.addCourse(courseName, coursePrice, courseTeacher, coursecategory);
// Course course2 = this.courseService.addCourse(courseName, coursePrice, courseTeacher, coursecategory); // , (new CourseCategory("Web", "Angular"))
// System.out.println(course.toString());
// System.out.println(course2.toString());
}
// 刪除
@Test
public void testRemoveCourse() throws CourseNameDuplicate {
System.out.println("\n3. testRemoveCourse");
CourseCategory courseCategory = new CourseCategory("Java", "Programming");
Course course2 = this.courseService.addCourse("Java", 100, "Mark", courseCategory);
Course course3 = this.courseService.addCourse("Spring", 300, "Kevin", (new CourseCategory("Java", "Programming")));
//this.courseService.courses.get(0).setCourseId(null); // 3.5 測試UUID不存在時刪除沒有影響
int couseSize = this.courseService.courses.size();
System.out.println("刪除前串列大小 : " + Integer.toString(couseSize));
System.out.println(this.courseService.courses.toString());
Assertions.assertEquals(couseSize, 2);
Course status = this.courseService.removeCourse(course2.getCourseId(),course2);
int couseSize2 = this.courseService.courses.size();
System.out.println("刪除項 : " + status);
System.out.println("刪除後串列大小 : " + Integer.toString(couseSize2));
System.out.println(this.courseService.courses.toString() + "\n");
Assertions.assertEquals(couseSize2, 1);
}
//@Test
@Order(3)
// 修改
public void testUpdateCourse() throws CourseNameDuplicate {
System.out.println("4. testUpdateCourse");
System.out.println("修改前");
Course course2 = this.courseService.addCourse("Java", 100, "Mark", (new CourseCategory("Java", "Programming")));
// System.out.println("courseId : [" +
// this.courseService.courses.get(0).getCourseId() + "]");
String courseName = "C++"; // "Java"
String newName = "Spring Boot";
int newPrice = 200;
String newTeacher = "Brian";
CourseCategory coursecategory = new CourseCategory("Java", "Programming");
//Course course = new Course(newName, newPrice, newTeacher, coursecategory);
//Course updateCourse(String courseId,String newName, Integer newPrice, String newTeacher,CourseCategory coursecategory);
for (Course c : this.courseService.courses) {
//System.out.println("c : " + c.toString());
if (c.getCourseName().equals(courseName)) {
System.out.println("c : " + c.toString());
Course course = this.courseService.updateCourse(c.getCourseId(),newName,newPrice,newTeacher,coursecategory);
System.out.println("修改後");
System.out.println(course.toString());
} else {
System.out.println((String) null + " [UUID錯誤,修改傳回為空]");
}
}
// if (course == null) {
// System.out.println((String) null + " [查無courseId,return null]");
// } else {
// System.out.println("\n修改後");
// System.out.println(course.toString() + "\n");
// }
}
public void testcourseMapget() {
Course course = this.courseService.testcourseMapget("Java");
System.out.println("test : " + course);
}
}
```
:::
---


---