{"id":93,"date":"2025-11-20T15:13:27","date_gmt":"2025-11-20T22:13:27","guid":{"rendered":"https:\/\/courses.cs.colostate.edu\/cs415\/?page_id=93"},"modified":"2026-01-12T21:32:04","modified_gmt":"2026-01-13T04:32:04","slug":"sprint-1","status":"publish","type":"page","link":"https:\/\/courses.cs.colostate.edu\/cs415\/sprint-1\/","title":{"rendered":"Sprint 1"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">P1. Sprint 1<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">ASSIGNED:&nbsp;29 January 2026<br>DUE:&nbsp;11:59PM, Tuesday, 3 March 2026<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\">100 points<\/h4>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Objectives<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Practice test-first development to implement core business logic of an application.<\/li>\n\n\n\n<li>Review programming in Java given a design specification.<\/li>\n\n\n\n<li>Develop JUnit 4 test cases using input space partitioning technique.<\/li>\n\n\n\n<li>Assess coverage using JaCoCo.<\/li>\n<\/ul>\n\n\n\n<p>Read the entire assignment before starting to code to get a full picture of what is needed. Some parts may be intentionally left unspecified. This will illustrate how TDD can help you identify what to do in such situations.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Description of Semester Project<\/h2>\n\n\n\n<p>The overall architecture is shown in the next figure along with colored annotations depicting the sprint that will develop the corresponding components. Note that DTOs and DBConnector components are provided to you inside the base code in the server\/src\/main\/java\/edu\/colostate\/cs415\/dto and server\/src\/main\/java\/edu\/colostate\/cs415\/db.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.cs.colostate.edu\/~cs415\/2025sp\/project\/p1\/ProjectArchitecture.png\" alt=\"Architecture\" \/><\/figure>\n\n\n\n<p>The next figure shows a partial design of a project management system as a class diagram containing the necessary classes and enumeration types in the core business logic. The classes are&nbsp;Company,&nbsp;Worker,&nbsp;Project, and&nbsp;Qualification. The enumeration types are&nbsp;ProjectStatus&nbsp;and&nbsp;ProjectSize, each with their shown values.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.cs.colostate.edu\/~cs415\/2025sp\/project\/p1\/BusinessLogicClassDiagram.png\" alt=\"Business Logic Class Diagram\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. How to read and implement the UML class diagram<\/h3>\n\n\n\n<p>Classes are shown with their names (e.g.,&nbsp;Company), attributes (e.g.,&nbsp;name&nbsp;of type&nbsp;String&nbsp;inside&nbsp;Company), and operations (e.g.,&nbsp;createProject, which takes a project name, a set of&nbsp;Qualification&nbsp;instances, and project size, and returns a&nbsp;Project&nbsp;instance.<\/p>\n\n\n\n<p>In the above diagram, associations are shown between two classes using multiplicity information at the association ends. For example, the association&nbsp;Requires&nbsp;between&nbsp;Project&nbsp;and&nbsp;Qualification&nbsp;indicates that (1) a project requires a certain set of qualifications (at least one qualification denoted by 1..*) and (2) the same qualification may be required in zero or more projects (denoted by *). A worker must have at least one qualification to be employed in the company.<\/p>\n\n\n\n<p>Sometimes two classes may be related by multiple associations (e.g., Worker and Company) and all these associations need to be implemented\/enforced by your code. For example, a worker may be employed in a company. A worker may be available or not depending on their workload. A worker may be assigned to a project or not. A worker may be in the assigned set but no longer available for other projects because of their workload.<\/p>\n\n\n\n<p>Associations must be implemented using appropriate data structures as additional fields in the appropriate class. For example, a set should be implemented using an implementation of the&nbsp;Set&nbsp;interface). The method parameters and return values in such cases should be&nbsp;Set, not the name of the implementation class (e.g.,&nbsp;HashSet&nbsp;and certainly not&nbsp;ArrayList&nbsp;&#8212; don&#8217;t use&nbsp;ArrayList&nbsp;in the implementation anyway!).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2. Assumptions<\/h3>\n\n\n\n<p>Assume that worker names and company names are unique. So are project names and qualification descriptions. You don&#8217;t need to implement checks for uniqueness. Test data will contain only unique names.<\/p>\n\n\n\n<p>A constraint for the entire system is that no worker should ever be overloaded. To determine overloading, consider all the projects the worker is involved in (except FINISHED projects) and calculate the workload. The workload is computed as (3*number_of_big_projects + 2*number_of_medium projects + number_of_small_projects) for the unfinished projects the worker is involved with. This should never exceed 12. If the workload is less than 12, then the worker is considered to be available, otherwise not.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3. Specification of Business Logic Classes and Operations<\/h3>\n\n\n\n<p>The operation specifications are listed for each class as follows. If during the development of test cases you feel that some specifications are missing, feel free to make up your own and note them in an overview document that you will submit as&nbsp;overview.txt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3.1. Class&nbsp;Qualification&nbsp;to be implemented in P1<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Qualification(description: String): Constructor<br>Creates a new instance of qualification using the description.<\/li>\n\n\n\n<li>equals(o: Object): boolean<br>This operation will be used by JUnit. Note that the argument to this operation must be of type&nbsp;Object, i.e. not&nbsp;equals(q : Qualification), etc. You will override the&nbsp;equals(o : Object)&nbsp;method inherited by the class. Two&nbsp;Qualification&nbsp;instances are equal if and only if their descriptions match.<\/li>\n\n\n\n<li>hashCode(): int<br>This operation is used when storing the object into a hashset or hashtable. It returns the hashcode of the attribute&nbsp;description.<\/li>\n\n\n\n<li>toString(): String<br>Returns the&nbsp;description.<\/li>\n\n\n\n<li>getWorkers(): Set&lt;Worker&gt;<br>Returns the set of workers that have this qualification. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no workers.<\/li>\n\n\n\n<li>addWorker(w: Worker): void<br>Adds worker to the set of workers with this qualification. It is not the responsibility of this method to ensure that the worker actually has the qualification. This will be ensured by the method that calls&nbsp;addWorker&nbsp;(e.g.,&nbsp;addQualification&nbsp;in&nbsp;Worker). Otherwise, the system will be in an inconsistent state.<\/li>\n\n\n\n<li>removeWorker(w: Worker): void<br>Removes the worker from the set of workers with this qualification. It is not the responsibility of this method to ensure that the worker is actually in the set of workers for this qualification, or is actually removed from the company or the projects. All of this will be ensured by the method that calls&nbsp;removeWorker. Otherwise, the system will be in an inconsistent state.<\/li>\n\n\n\n<li>toDTO(): QualificationDTO<br>Returns a data-transfer-object representing the qualification.&nbsp;The object contains the names of the workers. Do not use the toString() method. You will use the constructor for&nbsp;QualificationDTO.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">2.3.2. Class&nbsp;Worker&nbsp;to be implemented in P1<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Worker(name: String, qs: Set&lt;Qualification&gt;, salary: double): Constructor<br>Creates a new worker with the given&nbsp;name, the set of qualifications and salary. These qualifications must already be present in the company&#8217;s set of qualifications.<\/li>\n\n\n\n<li>equals(o: Object): boolean<br>This operation will be used by JUnit. Note that the argument to this operation must be of type&nbsp;Object, i.e. not&nbsp;equals (w : Worker), etc. You will override the&nbsp;equals(o: Object)&nbsp;method inherited by the class. Two&nbsp;Worker&nbsp;instances are equal if and only if their names match.<\/li>\n\n\n\n<li>hashCode(): int<br>This operation is used when storing the object into a hashset or hashtable. It returns the hashcode of the attribute&nbsp;name.<\/li>\n\n\n\n<li>toString(): String<br>Returns a&nbsp;String&nbsp;that includes the name, colon, #projects, colon, #qualifications, colon, salary. For example, a worker named &#8220;Nick&#8221;, working on 2 projects, and having 10 qualifications and a salary of 10000.20 will result in the string&nbsp;Nick:2:10:10000. Note that the salary has no decimals but is always rounded down (truncated.<\/li>\n\n\n\n<li>getName(): String<br>Returns the name field.<\/li>\n\n\n\n<li>getSalary(): double<br>Returns the salary field.<\/li>\n\n\n\n<li>setSalary(salary: double) void<br>Sets the salary field.<\/li>\n\n\n\n<li>getQualifications(): Set&lt;Qualification&gt;<br>Returns the qualifications of the worker as a&nbsp;Set. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no qualifications.<\/li>\n\n\n\n<li>addQualification(q: Qualification): void<br>Addd the qualification q to the set of qualifications of the worker. The set of qualifications for the worker should have no duplicates. It&#8217;s the caller&#8217;s responsibility to ensure that this qualification is from the company&#8217;s set of qualifications.<\/li>\n\n\n\n<li>getProjects(): Set(Project)<br>Returns a set of projects that this worker is in. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no projects.<\/li>\n\n\n\n<li>addProject(p : Project): void<br>The project gets added to this worker. It&#8217;s the responsibility of the caller (not&nbsp;addProject) to check if the project can be added to the worker and also to ensure that the worker is added to the project.<\/li>\n\n\n\n<li>removeProject(p: Project): void<br>Removes the project from the worker. It&#8217;s the responsibility of the caller (not&nbsp;removeProject) to check if the project can be removed from the worker, and also to ensure that the worker is removed from the project.<\/li>\n\n\n\n<li>getWorkload(): int<br>Returns the workload of the worker. The workload is computed as (3*number_of_big_projects + 2*number_of_medium projects + number_of_small_projects) for the projects the worker is involved with (but not FINISHED projects).<\/li>\n\n\n\n<li>willOverload(p: Project): boolean<br>Returns true if a worker will be overloaded if the worker gets assigned to the project &#8220;p&#8221;, false otherwise. If adding the new project (irrespective of its current status) to the existing unfinished projects of the worker makes the total workload greater than 12, then the worker will be overloaded. It&#8217;s the caller&#8217;s responsibility to ensure that the project is in the set of the company&#8217;s projects, but think carefully about what gets passed as a parameter (e.g., if the worker is already part of the project, etc).<\/li>\n\n\n\n<li>isAvailable(): boolean<br>Returns true if the workload of the worker is less than 12. False otherwise.<\/li>\n\n\n\n<li>toDTO(): WorkerDTO<br>Returns a data-transfer-object representing the worker.&nbsp;The object contains the names of the projects. Do not use the toString() method. You will use the constructor for&nbsp;WorkerDTO.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">2.3.3. Class&nbsp;Project&nbsp;to be implemented in P1<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Project(name: String, qs: Set(Qualification), size: ProjectSize): constructor<br>Creates an instance of a project with the name, qualifications, and size. A project always starts in the&nbsp;PLANNED&nbsp;state. Check for boundary conditions on the qualification set as well as the requirements on the String reference (not null). These qualifications must be from the company&#8217;s set of qualifications.<\/li>\n\n\n\n<li>equals(o: Object): boolean<br>This operation will be used by JUnit. Note that the argument to this operation must be of type&nbsp;Object, i.e. not&nbsp;equals (p : Project), etc. You will override the&nbsp;equals(o : Object)&nbsp;method inherited by the class. Two&nbsp;Project&nbsp;instances are equal if and only if their names match. Note that it is good practice to override the&nbsp;hashCode&nbsp;method when&nbsp;equals&nbsp;is overridden but we won&#8217;t be testing it in this assignment.<\/li>\n\n\n\n<li>hashCode(): int<br>This operation is used when storing the object into a hashset or hashtable. It returns the hashcode of the attribute&nbsp;name.<\/li>\n\n\n\n<li>toString(): String<br>Returns a&nbsp;String&nbsp;that includes the name, colon, number of assigned workers, colon, status. For example, a project named &#8220;CS5Anniv&#8221; using 10 assigned workers and status PLANNED will result in&nbsp;CS5Anniv:10:PLANNED. In the string, status is in upper case (as shown in the UML class diagram).<\/li>\n\n\n\n<li>getName(): String<br>Returns the name of the project.<\/li>\n\n\n\n<li>getSize(): ProjectSize<br>Returns the size of the project.<\/li>\n\n\n\n<li>getStatus(): ProjectStatus<br>Returns the status of the project.<\/li>\n\n\n\n<li>setStatus(s: ProjectStatus): void<br>Sets the status of the project.<\/li>\n\n\n\n<li>addWorker(w: Worker): void<br>Adds a worker to the project. It is up to the caller to determine whether this worker can be added to the project and all the project and company constraints are still enforced. For example, it is called by the&nbsp;assign&nbsp;method in the&nbsp;Company&nbsp;class.<\/li>\n\n\n\n<li>removeWorker(w: Worker): void<br>Removes a worker from the project. It is up to the caller to determine whether this worker can be removed from the project and if removed, making sure all the other project and company constraints are still enforced. For example, it is called by the&nbsp;unassign&nbsp;in the&nbsp;Company&nbsp;class.<\/li>\n\n\n\n<li>getWorkers(): Set&lt;Worker&gt;<br>Returns the set of workers assigned to the project. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no workers.<\/li>\n\n\n\n<li>removeAllWorkers(): void<br>Removes all the workers assigned to the project. It&#8217;s the responsibility of the calling method to make sure this can be done, and if it is done, the caller ensures that the state of the project is consistent. This part is not the responsibility of the&nbsp;removeAllWorkers&nbsp;method.<\/li>\n\n\n\n<li>getRequiredQualifications(): Set&lt;Qualification&gt;<br>Returns the set of all the qualifications required for the project. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no qualifications.<\/li>\n\n\n\n<li>addQualification(q: Qualification): void<br>Add q to the set of qualifications required for the project. The set of qualifications for the project should have no duplicates. It&#8217;s the caller&#8217;s responsibility to ensure that this qualification is from the company&#8217;s set of qualifications.<\/li>\n\n\n\n<li>getMissingQualifications(): Set&lt;Qualification&gt;<br>Compare the qualifications required by the project and those that are met by the workers currently assigned to the project. Return the set of qualifications that are not met. An empty set (not null set) is returned when all the qualification requirements are met. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no missing qualifications.<\/li>\n\n\n\n<li>isHelpful(w: Worker): boolean<br>If at least one of the missing qualification requirements of a project is satisfied by the worker, then return true, else return false.<\/li>\n\n\n\n<li>toDTO(): ProjectDTO<br>Returns a data-transfer-object representing the project.&nbsp;The object contains the names of the workers. Do not use the toString() method. You will use the constructor for&nbsp;ProjectDTO.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">2.3.4. Class&nbsp;Company&nbsp;to be implemented in P1<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Company(name: String)&nbsp;Constructor<br>Creates a company instance, and sets the name. There are no workers, projects, or qualifications to begin work.<\/li>\n\n\n\n<li>equals(o: Object) : boolean<br>This operation is needed by JUnit. Note that the argument to this operation must be of type&nbsp;Object, i.e. not&nbsp;equals (c : Company), etc. You will override the&nbsp;equals(o: Object)&nbsp;method inherited by the class. Two&nbsp;Company&nbsp;instances are equal if an only if their names match. Note that it is good practice to override the&nbsp;hashCode&nbsp;method when&nbsp;equals&nbsp;is overridden but we won&#8217;t be testing it in this assignment.<\/li>\n\n\n\n<li>toString() : String<br>Returns a&nbsp;String&nbsp;that includes the company name, colon, number of available workers, colon, and number of projects carried out. For example, a company called ABC that has 20 available workers and 10 projects will result in the string&nbsp;ABC:20:10.<\/li>\n\n\n\n<li>getName(): String<br>Returns the name of the company.<\/li>\n\n\n\n<li>getEmployedWorkers(): Set&lt;Worker&gt;<br>Returns the set of all workers employed by the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no employed workers.<\/li>\n\n\n\n<li>getAvailableWorkers(): Set&lt;Worker&gt;<br>Returns the set of all workers available in the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no available workers.<\/li>\n\n\n\n<li>getUnavailableWorkers(): Set&lt;Worker&gt;<br>Returns the set of all workers who are employed but not available. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no unavailable workers.<\/li>\n\n\n\n<li>getAssignedWorkers(): Set&lt;Worker&gt;<br>Returns the set of all workers assigned to some project in the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no assigned workers.<\/li>\n\n\n\n<li>getUnassignedWorkers(): Set&lt;Worker&gt;<br>Returns the set of all workers who are employed but not assigned to any projects in the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no unassigned workers.<\/li>\n\n\n\n<li>getProjects(): Set&lt;Project&gt;<br>Returns the set of projects in the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no projects.<\/li>\n\n\n\n<li>getQualifications(): Set&lt;Qualification&gt;<br>Returns the set of qualifications in the company. The order in the set is not under your control, so your tests shouldn&#8217;t assume any specific ordering in the returned object. Return an empty set if there are no qualifications.<\/li>\n\n\n\n<li>createWorker(name: String, qs: Set&lt;Qualification&gt;, salary: double): Worker<br>AKA hire a worker. Creates a new worker with the given name, set of qualifications, and salary. The set of qualifications must be a subset of the company&#8217;s set of qualifications. For programming safety, check for null references, and the presence of at least one qualification and return null if a worker instance can&#8217;t be created. A newly created worker has no assigned projects. Be sure to update the list of employed workers and available workers. This worker must have at least one qualification. You must add the worker to the set of workers for each of the qualifications instances possessed by the worker.<\/li>\n\n\n\n<li>createQualification(description: String): Qualification<br>Creates a new qualification with the given description and add it to the set of qualifications of this company. This qualification has no workers associated with it yet. Beware of null strings.<\/li>\n\n\n\n<li>createProject(name: String, qs: Set(Qualification), size: ProjectSize): Project<br>A new project is created and is entered in the set of projects carried out by the company. The name and size of the project are set. For each qualification in&nbsp;qs, add the qualification in the qualification requirements set of the project. The caller ensures that these qualifications must already be present in the company&#8217;s set of qualifications.<\/li>\n\n\n\n<li>start(p : Project): void<br>A PLANNED or SUSPENDED project may be started as long as the project&#8217;s qualification requirements are all satisfied. This project is now in ACTIVE status. Otherwise, the project remains PLANNED or SUSPENDED (i.e., as it was before the method was called).<\/li>\n\n\n\n<li>finish(p : Project): void<br>An ACTIVE project is marked FINISHED. The project no longer has any assigned workers. A SUSPENDED or PLANNED project remains as it was. Think of side-effects on all of the sets to make the appropriate changes..<\/li>\n\n\n\n<li>assign(w : Worker, p: Project): void<br>Only workers from the pool of available workers can be assigned as long as they are not already assiged to the same project. The project must not be in the ACTIVE or FINISHED state. The worker should not get overloaded by adding to this project. The worker can be added only if the worker is helpful to the project (i.e., meets at least one missing qualifications). If the conditions are satisfied, (1) the assigned worker is added to the pool of assiged workers of the company unless they were already present in that pool, and (2) the worker is also added to the project. Check if the worker should be moved out of the available pool.Note that the same worker can be in both the available pool and assigned pool of wokers at the same time. The worker can also be only in the assigned pool but not in the available pool if they are at their load limit (i.e., adding any project will make them overloaded).<\/li>\n\n\n\n<li>unassign(w: Worker, p: Project): void<br>The worker must have been assiged to the project to be unassigned. If this was the only project for the worker, then delete this worker from the pool of assigned workers of the company. Also think about other situations for the available and assigned pools. If the qualification requirements of an ACTIVE project are no longer met, that project is marked SUSPENDED. A PLANNED OR SUSPENDED project remains in that state.<\/li>\n\n\n\n<li>unassignAll(w: Worker): void<br>Remove the worker from all the projects that were assigned to the worker. Also remove the worker from the pool of assigned workers of the company. Change the state of the affected projects as needed.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">3. P1 Tasks<\/h2>\n\n\n\n<p>Always use good programming style and Github etiquette. Never commit to the main branch, always work on other branches. Create issues, pull requests, and merge pull requests. You are not allowed to merge your own pull requests. All of these factors will be considered during grading.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. Implementation<\/h3>\n\n\n\n<p>Each team has a repo assigned to them in the CSU-CS-CS415-Spring26 organization. The repo contains some base code that you will work on. Your task is to use test first development to implement the provided UML class diagram in the\u00a0<strong>core business logic<\/strong>, including all the classes, all the associations, and all the enumerated types.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Don&#8217;t include print statements anywhere in your submitted code.<\/li>\n\n\n\n<li>Don&#8217;t change the names\/spellings\/capitalization of methods, classes, enum types and values, and packages, and the types of parameters and associations.<\/li>\n\n\n\n<li>Don&#8217;t add any public or protected methods that are not listed. Feel free to add private methods if you need helper methods. The reason for disallowing public and protected methods is that using them will prevent your code from compiling with our code.<\/li>\n\n\n\n<li>Don&#8217;t add new classes\/interfaces\/enums. All that you need are the provided classes.<\/li>\n\n\n\n<li>What should be done when a method is passed invalid parameters such as a null input, empty string or string with only whitespace? Void and constructor methods should throw an exception when they receive null or invalid parameters. This applies also to those methods where it is the caller&#8217;s responsibility to ensure that the object belongs to the company. Any type of exception is fine, but do not use custom exception classes. Non-void methods should return either null or false when they receive null arguments. Negative values are invalid for salary and should be treated like the invalid values for string and throw and exception or return null depending on the method.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.2. Testing<\/h3>\n\n\n\n<p>You must apply a systematic technique for identifying test input values. The technique is called input space partitioning and you must show your work to explain how you derived the input values by first identifying the domains, then the partitions, and showing that the partitions are complete and non-overlapping. You will also use Base Choice Coverage.<\/p>\n\n\n\n<p>Create a file&nbsp;reports\/P1_ISP.md&nbsp;(markdown file) in your repository. It should describe your strategies for creating the tests for the methods in the four classes you implemented in this iteration. The following sample tables show how you can display the partitions and BCC.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-1024x576.png\" alt=\"\" class=\"wp-image-101\" srcset=\"https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-1024x576.png 1024w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-300x169.png 300w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-768x432.png 768w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-1536x864.png 1536w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable-676x380.png 676w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleISPTable.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-1024x576.png\" alt=\"\" class=\"wp-image-102\" srcset=\"https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-1024x576.png 1024w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-300x169.png 300w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-768x432.png 768w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-1536x864.png 1536w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable-676x380.png 676w, https:\/\/courses.cs.colostate.edu\/cs415\/wp-content\/uploads\/sites\/50\/2025\/11\/SampleBCCTable.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Implement your JUnit test cases such that the test cases for each class in the class diagram appear in a separate file. For example, the test cases for&nbsp;Project&nbsp;must be written in&nbsp;ProjectTest.java,&nbsp;Worker&nbsp;in&nbsp;WorkerTest, and so on. Thus, you will have four test files in P1 called&nbsp;CompanyTest.java,&nbsp;CompanyTest.java,&nbsp;WorkerTest.java,&nbsp;ProjectTest.java, and&nbsp;QualificationTest.java.<\/p>\n\n\n\n<p>Create a table showing the names of the JUnit test methods and the corresponding combination of input values that you used in the ISP table. This will help us confirm that you actually used ISP in your JUnit tests. You may write additional JUnit tests that are created using some other strategy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.3. Coverage Report<\/h3>\n\n\n\n<p>The workflow CI will produce coverage information, so the graders will get the report from there. However, you should also collect the coverage information and&nbsp;<strong>reflect<\/strong>&nbsp;on it in your coverage report.<\/p>\n\n\n\n<p>When you run mvn test, the coverage report will be inside&nbsp;server\/target\/site\/jacoco.<\/p>\n\n\n\n<p>Create a file&nbsp;reports\/P1_coverage.md&nbsp;in your repository. It should contain a coverage report showing in tabular format, the method, statement, and branch coverages for each method in the classes&nbsp;Company,&nbsp;Project,&nbsp;Worker, and&nbsp;Qualification. Remember to reflect on this table.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4. Reflection Report<\/h3>\n\n\n\n<p>Create a file&nbsp;reports\/P1_reflection.md&nbsp;in your repository. It should contain a reflection on what went well and did not go well, and what would be done differently next time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.5. Peer evaluation survey on Canvas<\/h3>\n\n\n\n<p>Each team member does a survey and gets a separate grade. Note that this grade is separate from the grades mentioned in the next section.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Grading criteria<\/h2>\n\n\n\n<p>Team scores will be based on both the product and the process. Individual adjustments will be made based on quality of contributions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1. Team scores<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Process component (25 points)\n<ol class=\"wp-block-list\">\n<li>Pull requests<\/li>\n\n\n\n<li>Issues<\/li>\n\n\n\n<li>Branches<\/li>\n\n\n\n<li>Commits<\/li>\n\n\n\n<li>Commits to main (Should be none)<\/li>\n\n\n\n<li>How the work is distributed across the sprint (waiting to work until the end is bad)<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Product component (75 points)\n<ol class=\"wp-block-list\">\n<li>Quality of your implementation (20 points): We will test your implementation using our test cases.<\/li>\n\n\n\n<li>Quality of your test cases (20 points): We will use faulty versions with known faults and assess the ability of your test cases to detect these faults.<\/li>\n\n\n\n<li>Quality of your implementation and tests with respect to each other (5 points): We will run your code against your tests and we expect all your tests to pass.<\/li>\n\n\n\n<li>Use of input space partitioning (20 points): We will grade your&nbsp;P1_ISP.md&nbsp;report on how you applied input space partitioning.<\/li>\n\n\n\n<li>Submission of coverage report (5 points): We will grade your code coverage report (P1_coverage.md).<\/li>\n\n\n\n<li>Reflection report (5 points): We will grade your reflection (P1_reflection.md)<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Note that we are going to evaluate your implementation and tests VERY, VERY thoroughly. We have hundreds of test cases and faults to inject. You must think about all possible corner cases, inputs, and sequence of method calls.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2. Individual Adjustments<\/h3>\n\n\n\n<p>Adjustments can be positive or negative up to 20 points and for reasons such as:low individual process score,bad peer reviews from teammates,gaming the system (e.g., purposefully increasing the number of commits without actually imlementing much functionality).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.3. GitHub Actions<\/h3>\n\n\n\n<p>We use automated Github Actions to compile and tests the code that you push code to Github. You must never push broken code to the main branch, in other words you must never &#8220;break main&#8221;. Github Actions are one of the tools that we use to calculate your grade.&nbsp;You are not allowed to add\/modify\/delete any GitHub action, workflow, or workflow run.If you modify a workflow file, we are going to see it in the repository git history, and your team is going to lose points.If you delete a workflow run, we are going to see that there is a missing workflow run for a specific &#8216;git push&#8217;, and your team is going to lose points.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>P1. Sprint 1 ASSIGNED:&nbsp;29 January 2026DUE:&nbsp;11:59PM, Tuesday, 3 March 2026 100 points 1. Objectives Read the entire assignment before starting to code to get a full picture of what is needed. Some parts may be intentionally left unspecified. This will illustrate how TDD can help you identify what to do in such situations. 2. Description [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","footnotes":""},"class_list":["post-93","page","type-page","status-publish","hentry","post-preview"],"taxonomy_info":[],"featured_image_src_large":false,"author_info":{"display_name":"ghosh","author_link":"https:\/\/courses.cs.colostate.edu\/cs415\/author\/ghosh\/"},"comment_info":0,"_links":{"self":[{"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/pages\/93","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/comments?post=93"}],"version-history":[{"count":3,"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/pages\/93\/revisions"}],"predecessor-version":[{"id":108,"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/pages\/93\/revisions\/108"}],"wp:attachment":[{"href":"https:\/\/courses.cs.colostate.edu\/cs415\/wp-json\/wp\/v2\/media?parent=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}