# 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); } } ``` ::: --- ![](https://i.imgur.com/EAKJuMh.png) ![](https://i.imgur.com/eBseeMb.png) ---